Dydaktyka:
Feedback
cat [plik]...
wyświetla podane pliki jeden po drugim (lub
wyświetla dane przeczytane ze standardowego wejścia jeśli nie podano pliku).
Nazwa bierze się od operacji konkatenacji
Z przełącznikiem -n
program cat
numeruje linie, a z -v
wyświetla
bajty reprezentujące niedrukowalne znaki ASCII jako reprezentujący je tekst1).
paste plik_1 [plik_2]...
czyta po jednej linii z każdego z plików
i wypisuje je oddzielone tabem, powtarzając to do wyczerpania najdłuższego pliku.
join [-t separator] [-1 filed_1] [-2 filed_2] infile_1 infile_2
łączy te wiersze z pliku infile_1 z wierszami pliku infile_2, które na polu filed_1 w pliku infile_1 mają tę samą wartość co na polu field_2 w pliku infile_2 (pola w wierszu są oddzielane separatorem). Oba pliki muszą być posortowane względem pola które jest używane jako klucz połączenia.
fold [-w szer] [plik]...
wyświetla podane pliki (lub standardowe
wejście) wstawiając znak nowej linii kiedy tylko wypisywana linia miałaby być
dłuższa niż szer (domyślnie 80).
fold -s …
wstawia nowe linie w miejsce ostatniej spacji przed szer (chyba
że nie ma ich w wierszu, wtedy wstawia je na szer-1).
column [-x] [plik]...
działa jak cat
jeśli najdłuższa linia w
plikach (bądź standardowym wejściu) nie zmieściłaby się dwukrotnie na szerokość
w terminalu;
w innym wypadku, wypisuje dane w tylu kolumnach ile mieści się na szerokość terminala,
uzupełniając wpierw kolumny (albo, z -x
, wiersze).
column -t [plik]...
robi coś zupełnie innego: wykrywa kolumny w liniach
(rozdzielone separatorem, domyślnie białymi znakami) i formatuje pliki / wejście
w tabelę.
od [-t x1] …
, hexdump [-C] …
, i xxd …
pokazują pliki binarnie.
user@host ~ $ ls b t x user@host ~ $ cat b 99 little bugs in the code. 99 little bugs in the code. Take one down, patch it around, 127 little bug in the code... (common proverb) user@host ~ $ cat t Does a good farmer neglect a crop he has planted? Does a good teacher overlook even the most humble student? Does a good father allow a single child to starve? Does a good programmer refuse to maintain his code? user@host ~ $ cat b t 99 little bugs in the code. 99 little bugs in the code. Take one down, patch it around, 127 little bug in the code... (common proverb) Does a good farmer neglect a crop he has planted? Does a good teacher overlook even the most humble student? Does a good father allow a single child to starve? Does a good programmer refuse to maintain his code? user@host ~ $ paste b t 99 little bugs in the code. Does a good farmer neglect a crop he has planted? 99 little bugs in the code. Does a good teacher overlook even the most humble student? Take one down, patch it around, Does a good father allow a single child to starve? 127 little bug in the code... Does a good programmer refuse to maintain his code? (common proverb) user@host ~ $ fold -w 32 t Does a good farmer neglect a cro p he has planted? Does a good teacher overlook eve n the most humble student? Does a good father allow a singl e child to starve? Does a good programmer refuse to maintain his code? user@host ~ $ fold -sw 32 t Does a good farmer neglect a crop he has planted? Does a good teacher overlook even the most humble student? Does a good father allow a single child to starve? Does a good programmer refuse to maintain his code? user@host ~ $ column b 99 little bugs in the code. 127 little bug in the code... 99 little bugs in the code. (common proverb) Take one down, patch it around, user@host ~ $ column -x b 99 little bugs in the code. 99 little bugs in the code. Take one down, patch it around, 127 little bug in the code... (common proverb) user@host ~ $ column -t b 99 little bugs in the code. 99 little bugs in the code. Take one down, patch it around, 127 little bug in the code... (common proverb) user@host ~ $ cat x Hello wolrld! nah, been to an airport naïve rôle user@host ~ $ cat -v x Hello wolr^H^Hrld! As pretty as an airport^Mnah, been to naM-CM-/ve rM-CM-4le user@host ~ $ hexdump -C x 00000000 48 65 6c 6c 6f 20 77 6f 6c 72 08 08 72 6c 64 21 |Hello wolr..rld!| 00000010 0a 41 73 20 70 72 65 74 74 79 20 61 73 20 61 6e |.As pretty as an| 00000020 20 61 69 72 70 6f 72 74 0d 6e 61 68 2c 20 62 65 | airport.nah, be| 00000030 65 6e 20 74 6f 20 0a 6e 61 c3 af 76 65 20 72 c3 |en to .na..ve r.| 00000040 b4 6c 65 0a |.le.| 00000044 user@host ~ $ cat bbc_big_read.txt 1|The Lord of the Rings|J. R. R. Tolkien 2|Pride and Prejudice|Jane Austen 3|His Dark Materials|Philip Pullman 4|The Hitchhiker's Guide to the Galaxy|Douglas Adams 5|Harry Potter and the Goblet of Fire|J. K. Rowling 6|To Kill a Mockingbird|Harper Lee 7|Winnie-the-Pooh|A. A. Milne 8|Nineteen Eighty-Four|George Orwell 9|The Lion, the Witch and the Wardrobe|C. S. Lewis 10|Jane Eyre|Charlotte Brontë user@host ~ $ cat goodreads.txt 1|To Kill a Mockingbird|Harper Lee 2|Harry Potter and the Sorcerer’s Stone|J.K. Rowling 3|The Great Gatsby|F. Scott Fitzgerald 4|Nineteen Eighty-Four|George Orwell 5|Animal Farm|George Orwell 6|The Hobbit, or There and Back Again|J.R.R. Tolkien 7|The Little Prince|Antoine de Saint-Exupéry 8|Fahrenheit 451|Ray Bradbury 9|The Catcher in the Rye|J.D. Salinger 10|The Lion, the Witch and the Wardrobe|C.S. Lewis user@host ~ $ sort -t '|' -k 2 goodreads.txt > goodreads.sorted.txt user@host ~ $ sort -t '|' -k 2 bbc_big_read.txt > bbc_big_read.sorted.txt user@host ~ $ join -t '|' -j 2 bbc_big_read.sorted.txt goodreads.sorted.txt Nineteen Eighty-Four|8|George Orwell|4|George Orwell The Lion, the Witch and the Wardrobe|9|C. S. Lewis|10|C.S. Lewis To Kill a Mockingbird|6|Harper Lee|1|Harper Lee user@host ~ $ join -t '|' -j 2 bbc_big_read.sorted.txt goodreads.sorted.txt | column -t -s '|' Nineteen Eighty-Four 8 George Orwell 4 George Orwell The Lion, the Witch and the Wardrobe 9 C. S. Lewis 10 C.S. Lewis To Kill a Mockingbird 6 Harper Lee 1 Harper Lee
Zadanie 1 Wyświetl plik używając cat
. Wyświetl dwa pliki naraz używając cat
.
(Jeśli nie masz pomysłu jakie pliki wyświetlić, użyj np. /etc/SUSE-brand
i /etc/os-release
)
Zadanie 2 Uruchom cat
, wpisz dowolny tekst, potem naciśnij Enter i Ctrl+d.
Zadanie 3 Wyświetl plik /usr/share/doc/mpich/user.pdf
zarówno z przełącznikiem -v
jak i bez niego.
Zadanie 4 Użyj paste
do połączenia pliku z samym sobą.
Zadanie 5 Wyświetl plik /etc/mtab
formatując go jako tabelę.
Używając przełącznika -s
do wybrania separatora wyświetl /etc/passwd
formatując go jako tabelę.
Zadanie 6 Wyświetl binarny plik (np. /usr/share/themes/Breeze/assets/line-h.png
).
echo tekst
wypisuje tekst i znak nowej linii.
Większość implementacji echo
implementuje przełącznik -n
który pomija
dodawnie znaku nowej linii.
Część implementacji zna też przełącznik -e
, który powoduje zamianę sekwencji
takich jak \t
czy \n
na odpowiadające im znaki (tutaj: tab i nowa linia).
Część implementacji zawsze zmienia sekwencje sterujące na odpowiadające im znaki
(i zgłasza błąd jeśli napotka przełącznik -e
).
printf format [argument]...
działa jak funkcja printf
z języka C (z pewnymi dodatkami).
figlet [tekst]
wypisuje tekst (lub standardowe wejście) rysowane ascii-art'ową czcionką.
cowsay [tekst]
wyświetla krowę mówiącą tekst (lub standardowe wejście).
user@host ~ $ echo Nuddlegg Nuddlegg user@host ~ $ echo -n Nuddlegg Nuddlegguser@host ~ $ echo user@host ~ $ echo 'cr:|\r|, newline:(\n), tab:<\t>, backspace:[\b]' cr:|\r|, newline:(\n), tab:<\t>, backspace:[\b] user@host ~ $ echo -e 'cr:|\r|, newline:(\n), tab:<\t>, backspace:[\b]' |, newline:( ), tab:< >, backspace:] user@host ~ $ printf "Text\n" Text user@host ~ $ printf "Hex: %x; Dec: %ld%04u, Str: %s\n" 3735928559 8 85 foo Hex: deadbeef; Dec: 80085, Str: foo user@host ~ $ figlet Hello. _ _ _ _ | | | | ___| | | ___ | |_| |/ _ \ | |/ _ \ | _ | __/ | | (_) | |_| |_|\___|_|_|\___(_) user@host ~ $ cowsay Moo. ______ < Moo. > ------ \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
Zadanie 7 Sprawdź działanie echo -e 'foo\n\nbaz'
oraz echo -e '\n\n one \033[A \033[A two \033[B \033[B \n \033[1;31m red \033[0m'
Sekwencje sterujące ANSI są dobrze opisane tutaj oraz w podręczniku systemowym na stronie console_codes
.
Zadanie 8 Sprawdź działanie printf "|%4.2f|%3s|%-16s|\n|%4.2f|%3s|%-16s|\n" 3.1428 pi obwod/srednica 9.8 g grawitacja
seq [start [krok]] granica
generuje sekwencje liczb zaczynające się od start, zwiększanego o krok dopóki nie zostanie przekroczona granica.
Jeśli nie podano, start i krok mają wartość 1.
Opcja -w
dopisuje taką ilość zer, by liczby miały tyle samo znaków (np. seq -w 8 11
wypisze 08, 09, 10 i 11).
user@host ~ $ seq 3 1 2 3 user@host ~ $ seq 33 35 33 34 35 user@host ~ $ seq 100 10 125 100 110 120 user@host ~ $ seq 3 -1 1 3 2 1 user@host ~ $ seq -w 001 3 001 002 003
Zadanie 9 Wygeneruj sekwencję liczb od 1 do 15.
Zadanie 10 Wygeneruj sekwencję liczb od 64 do 1024 z krokiem co 64.
K&R C[1] [2]printf("Wpisz swoje imię:\n") scanf("%s", name); | Pythonprint("Wpisz swoje imię:") name = input() |
Czy zastanawiałeś się skąd program wie skąd czytać dane wejściowe i gdzie funkcje takie jak print powinny wypisywać?
W "uniksowym" świecie program oczekuje że w momencie uruchomienia będzie
mieć otwarte trzy pliki – standardowe wejście, standardowe wyjście i standardowy
błąd. (Które razem są nazywane standardowymi strumieniami.)
Bazuje na tym standardowa biblioteka wejścia/wyjścia z języka C – stdio.h
.
C zostało stworzone przez jednego z autorów UNIXa.
W większości języków programowania podstawowe funkcje I/O czytają ze
standardowego wejścia i piszą do standardowego wyjścia.
Standardowy błąd w założeniu ma służyć do raportowania co poszło nie tak.
Języki programowania często mają dedykowane funkcje piszące do tego strumienia.
W uniksopodobnych jak i kompatybilnych z POSIX-em systemach system operacyjny
zajmuje się faktyczną realizacją dostępu do pliku, a użytkownik tylko zleca
jakie operacje mają być wykonane. Otwierając plik użytkownikowi zwracany jest
jego identyfikator – deskryptor pliku – liczba całkowita będąca w
rzeczywistości indeksem w odpowiedniej tablicy systemu operacyjnego.
Zlecając operacje take jak np. odczyt danych, użytkownik podaje ten numer,
rodzaj operacji i jej szczegóły, np. dla odczytu podaje ile bajtów odczytać
i gdzie umieścić odczytane bajty.
Proces potomny dziedziczy wszystkie deskryptory rodzica.
Trzy standardowe strumienie to pliki wskazywane przez trzy pierwsze deskryptory:
0 jest zawsze standardowym wejściem, 1 wyjściem, a 2 błędem.
W uniksopodobnych systemach "plik" niekoniecznie jest danymi na dysku, system UNIX próbował wszystko reprezentować jako pliki. Na przykład, dla systemu terminal jest plikiem (nawet jeśli jest podłączoną do komputera maszyną do pisania).
Domyślnie powłoki mają otwarty terminal jako pliki 0, 1 i 2.
Zgodne z POSIX-em powłoki potrafią zastąpić standardowe strumienie wskazanymi przez użytkownika.
komenda > nazwa_pliku
komenda 2> nazwa_pliku
komenda &> nazwa_pliku
Uwaga: to jest rozszerzenie powłoki Bash
komenda >> nazwa_pliku
/dev/null
jest urządzeniem które zaakceptuje każdy zapis i zignoruje przekazane dane ("czarna dziura").
user@host ~ $ figlet Moo. > mu user@host ~ $ cat mu __ __ | \/ | ___ ___ | |\/| |/ _ \ / _ \ | | | | (_) | (_) | |_| |_|\___/ \___(_) user@host ~ $ cat /root/.ssh/id_ecdsa cat: /root/.ssh/id_ecdsa: Brak dostępu user@host ~ $ cat /root/.ssh/id_ecdsa > /dev/null cat: /root/.ssh/id_ecdsa: Brak dostępu user@host ~ $ cat /root/.ssh/id_ecdsa 2> /dev/null user@host ~ $ md5sum dir/* 862a24df285d12b2ad908bf57a417747 dir/a 66b4d2409c4eb9a8f728cd80f798ce9d dir/b md5sum: dir/c: Brak dostępu md5sum: dir/d: Brak dostępu f417af6f1fc98b99efb549bf55b18440 dir/e md5sum: dir/f: Brak dostępu 58136e3d09ad6793df038e11081355ef dir/g user@host ~ $ md5sum dir/* > stdout 2> stderr user@host ~ $ cat stdout 862a24df285d12b2ad908bf57a417747 dir/a 66b4d2409c4eb9a8f728cd80f798ce9d dir/b f417af6f1fc98b99efb549bf55b18440 dir/e 58136e3d09ad6793df038e11081355ef dir/g user@host ~ $ cat stderr md5sum: dir/c: Brak dostępu md5sum: dir/d: Brak dostępu md5sum: dir/f: Brak dostępu user@host ~ $ echo ala > e user@host ~ $ echo ma >> e user@host ~ $ echo kota >> e user@host ~ $ echo -n "a sierotka ma" >> e user@host ~ $ echo "rysia" >> e user@host ~ $ cat e ala ma kota a sierotka marysia
Zadanie 11 Komenda date
wypisuje bieżącą datę. Przekieruj jej wynik do pliku.
Zadanie 12 Dodaj kolejną datę do pliku z poprzedniego zadania.
Zadanie 13 Wykonaj komendę cat /etc/motd /etc/shadow
. Przekieruj jej standardowy błąd do pliku.
Zadanie 14 Wykonaj find /var/spool/
(polecenie find
będzie omawiane później). Przekieruj standardowy błąd do pliku /dev/null
.
Zadanie 15 Przekieruj standardowe wyjście komendy find /var/spool/
do jednego pliku, a standardowy błąd do innego.
Zadanie 16 Przekieruj standardowe wyjście i standardowy błąd komendy find /var/spool/
do tego samego pliku.
komenda < nazwa_pliku
komenda << ogranicznik
(here document)
komenda <<< tekst
(here string) Uwaga: to jest rozszerzenie powłoki Bash
user@host ~ $ cowsay -n < mu _______________________ / __ __ \ | | \/ | ___ ___ | | | |\/| |/ _ \ / _ \ | | | | | | (_) | (_) | | | |_| |_|\___/ \___(_) | \ / ----------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || user@host ~ $ gnuplot << EOF > set terminal dumb ansi > set xrange [0:2*pi] > set yrange[-1.2:1.2] > set grid > plot sin(x) with filledcurves lc "cyan" > EOF +--------------------------------------------------------------------+ | + + + + + + | 1 |-+........:.++++++++++..........:..........:.........sin(x).+-----+-| | +++XXXXXXXXX+++ : : : : | | +++XXXXXXXXXXXXXX++ : : : : | | +++XXXXXXXXXXXXXXXXXX++ : : : : | 0.5 |-+..++XXXXXXXXXXXXXXXXXXXXXX+...:..........:..........:..........:+-| | ++XXXXXXXXXXXXXXXXXXXXXXXXX++ : : : : | | ++XXXXXXXXXXXXXXXXXXXXXXXXXXX++: : : : | |+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+ : : : | 0 |-+........:..........:..........:++XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX| | : : : +XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+| | : : : ++XXXXXXXXXXXXXXXXXXXXXXXXXXX++ | | : : : ++XXXXXXXXXXXXXXXXXXXXXXXXX++ | -0.5 |-+........:..........:..........:......+XXXXXXXXXXXXXXXXXXXXXX++.:+-| | : : : ++XXXXXXXXXXXXXXXXXX+++ : | | : : : ++XXXXXXXXXXXXXX+++ : | | : : : :+++XXXXXXXXX+++ : | -1 |-+........:..........:..........:..........:..++++++++++.........:+-| | + + + + + + | +--------------------------------------------------------------------+ 0 1 2 3 4 5 6 user@host ~ $ jq . <<< '{"l":1.23,"t":[{"a":"A","b":"B"},{"1":"¹","2":"²"}],"z":"org"}' { "l": 1.23, "t": [ { "a": "A", "b": "B" }, { "1": "¹", "2": "²" } ], "z": "org" } user@host ~ $
Zadanie 17 Stwórz plik zawierający print("hello " + __file__)
. Uruchom komendę python
, kolejno: podając plik jako argument, i przekierowując plik jako standardowe wejście.
Zadanie 18 Użyj programu hexdump -C
do wyświetlenia dowolnego tekstu wpisanego jako here document.
Użyj w tekście wielobajtowego znaku (np. 'Witaj świecie!'
zawiera dwubajtowy znak ś
).
Zadanie 19 bc
jest prostym kalkulatorem. Użyj go żeby policzyć sqrt(2.0000)
.
Potem policz sqrt(2.0000)
w nieinteraktywnym trybie.
Zadanie 20 Użyj bc
do policzenia sqrt(2.0000)
w nieinteraktywnym trybie i przekieruj wynik do pliku.
Rozdział o przekierowaniach w standardzie POSIX
Dokumentacja Basha o przekierowaniach
Każde przekierowanie ma postać: [deskryptor_pliku]operator słowo
Domyślny deskryptor_pliku to 0 jeśli operator zawiera <
albo 1 w przeciwnym wypadku
Czyli: komenda < plik
jest identyczna z komenda 0< plik
, a komenda >> plik
jest identyczna z komenda 1>> plik
.
Standard POSIX wymaga by deskryptory od 0 do 9 były do dyspozycji użytkownika. To jak można wykorzystywać inne numery zależy od użytej powłoki.
Dostępne operatory to:
< | otwiera plik słowo do odczytu i zastępuje deskryptor_pliku nowo otwartym |
> | wyświetla błąd jeśli plik słowo istnieje i opcja "noclobber" jest ustawiona2), otwiera plik słowo do zapisu, ucina go i zastępuje deskryptor_pliku nowo otwartym plikiem |
>| | otwiera plik słowo do zapisu, ucina go i zastępuje deskryptor_pliku nowo otwartym plikiem (niezależnie czy plik słowo istnieje) |
>> | otwiera plik słowo do dopisywania i zastępuje deskryptor_pliku nowo otwartym |
<> | otwiera plik słowo do odczytu i zapisu, oraz zastępuje deskryptor_pliku nowo otwartym |
<< | 1) tworzy tymczasowy plik 2) czyta linię ze standardowego wejścia 3) jeśli cała linia to dokładnie słowo, idź do 7 4) jeśli słowo nie było ujęte w cudzysłowy (pary " lub ' ), wykonuje podstawienia3) w linii 5) pisze linię do pliku tymczasowego 6) wraca do 2 7) otwiera plik tymczasowy do odczytu 8) zastępuje deskryptor_pliku nowo otwartym 9) uruchamia komendę |
<<- | działa jak << , ale po kroku 2 dodaje jeszcze krok: 2a) usuwa wszystkie początkowe tabulatory ( \t ) uwaga: spacje nie są usuwane |
<<< | Uwaga: to jest rozszerzenie powłoki Bash 1) tworzy tymczasowy plik 2) pisze słowo do pliku tymczasowego 3) pisze znak nowego wiersza do pliku tymczasowego 4) otwiera plik tymczasowy do odczytu 5) zastępuje deskryptor_pliku nowo otwartym 6) uruchamia komendę |
<& | jeśli słowo jest deskryptorem pliku p otwartym w trybie pozwalającym na odczyt: duplikuje deskryptor p tak żeby zarówno słowo jak i deskryptor_pliku odnosiły się do tego samego jeśli słowo jest - : zamyka deskryptor_pliku |
>& | jeśli słowo jest deskryptorem pliku p otwartym w trybie pozwalającym na zapis: duplikuje deskryptor p tak żeby zarówno słowo jak i deskryptor_pliku odnosiły się do tego samego jeśli słowo jest - : zamyka deskryptor_pliku |
&> | Uwaga: to jest rozszerzenie powłoki Bash Uwaga: ten operator nie pozwala podawać deskryptora_pliku ( & jest odczytywane jako deskryptor) otwiera plik słowo do zapisu, ucina go, duplikuje go i zastępuje zarówno 1 jak i 2 nowo otwartym plikiem |
&>> | Uwaga: to jest rozszerzenie powłoki Bash Uwaga: ten operator nie pozwala podawać deskryptora_pliku ( & jest odczytywane jako deskryptor) otwiera plik słowo do dopisywania, duplikuje go i zastępuje zarówno 1 jak i 2 nowo otwartym plikiem |
Zadanie 21 Uruchom cat /etc/motd
z zamkniętym deskryptorem standardowego wyjścia.
Uruchom find /var/spool/
z zamkniętym deskryptorem standardowego błędu.
Zadanie 22 Przekieruj standardowe wyjście i standardowy błąd komendy cat /etc/motd /etc/shadow
do jednego pliku bez użycia nieprzenośnej składni &>
.
Zadanie 23 Skopiuj duży plik tekstowy (np. /etc/services
) do pliku p.
Uruchom hexdump
przekierowując wejście z pliku p używając operatora <>
,
i zduplikuj standardowe wejście do standardowego wyjścia. Sprawdź co się stało.
Uwaga: nie używaj dwukrotnie <>
z tym samym plikiem dla standardowego wejścia
i standardowego wyjścia (chyba że jesteś gotowy ponieść konsekwencje swojego czynu).
Zadanie 24 Zamień miejscami standardowe wyjście i standardowy błąd komendy
cat /etc/motd /etc/shadow
.
Sprawdź działanie dodając |rev
na koniec
(co odwróci kolejność znaków na standardowym wyjściu).
Wykonanie przekierowania na komendzie exec
spowoduje przekierowanie standardowych strumieni bieżącej powłoki.
exec 3>&1 # duplikuje standardowe wyjście do deskryptora 3 exec 1>plik # zastępuje standardowe wyjście plikiem 'plik' date # wypisuje datę na standardowe wyjście (którym jest teraz 'plik') fortune # " fortunkę " exec 1>&3 3>&- # przywraca poprzednie wyjście (duplikując je z deskryptora 3) i zamyka 3
Dokumentacja Basha na temat process substitution
Składnia komenda1 <(komenda2)
i komenda1 >(komenda2)
nie są przekierowaniami.
Bash zastępuje <(komenda)
nazwą tymczasowego pliku (pipe), uruchamia w tle polecenie komenda
ustawiając jego standardowe wyjście na plik tymczasowy.
Bash zastępuje >(komenda)
nazwą tymczasowego pliku (pipe), uruchamia w tle polecenie komenda
ustawiając jego standardowe wejście na plik tymczasowy.
Zadanie 25 Wykonaj i zrozum wyniki poleceń:
paste <(hostname) <(date +%Y.%m.%d) <(uptime)
cat /etc/motd /etc/shadow 2> >(rev) > >(hexdump -C)
/bin/ls -l >(echo a) >(echo b) <(echo c)
stat >(echo c)
stat >(sleep 3; fortune)
cat <(echo a)
echo 'abc' > >(rev)
cat <(date) > >(rev)
cat < <(date) > >(rev)
cat <(date) <(date) <(date) > >(rev)
cat <(date) <(date) < <(date) > >(rev)
\t
i \n
, zastąpionym przez X
), wykonując: perl -e'for(0..15){printf"\t%x_",$_};print"\n";for$l(0..15){printf"_%x",$l;for$h(0..15){$c=$h<<4|$l;$c=88 if $c==9||$c==10;printf("\t%c",$c)}print"\n"}'|cat -v
set -C
.