Dydaktyka:
To jest stara wersja strony!
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.
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
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 (to ostatnie można wyłączyć podając -n
).
Przełącznik -e
powoduje zamianę sekwencji takich jak \t
czy \n
na odpowiadające im znaki (tutaj: tab i nowa linia).
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
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 6 4) jeśli w słowie nie ma cudzysłowów (pary " lub ' ), wykonuje podstawienia3) w linii 5) pisze linię do pliku tymczasowego 6) otwiera plik tymczasowy do odczytu 7) zastępuje deskryptor_pliku nowo otwartym 8) 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 z tym samym plikiem dla standardowego wejścia
i standardowego błędu (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)
Dla przypomnienia: standardowe funkcje I/O czytają ze standardowego wejścia, a piszą do standardowego wyjścia.
Uniksopodobne systemy przez długie lata4) trzymały się założenia,
że każdy program ma solidnie wykonywać jedno dobrze określone zadanie.
Żeby zrobić skomplikowane zadania, należy podzielić je na mniejsze rozwiązywalne
przez takie proste programy.
Dla przykładu: powiedzmy że chcesz dowiedzieć się ile procesów ma każdy z użytkowników systemu.
ps -ef
wypisuje procesy, więc zapisujesz do pliku ich listę: ps -ef > ps_output
.cut --delimiter ' ' --field 1 < ps_output > cut_output
.sort < cut_output > sort_output
sortujesz plik.uniq --count < sort_output
która pomija powtarzające się linie i przed każdą linię wpisuje ile razy się powtórzyła.
Ale: żeby wykonać takie zadanie powstały (niepotrzebne) pliki ps_output
, cut_output
i sort_output
.
W systemie UNIX wprowadzono możliwość połączenia standardowego wyjścia jednego
programu ze standardowym wejściem innego programu.
Zamiast wykonywać powyższe komendy, można uruchomić
ps -ef | cut --delimiter ' ' --field 1 | sort | uniq --count
które robi to samo bez tworzenia żadnych plików na dysku.
Łączenie standardowego wyjścia jednego programu ze standardowym wejściem innego
jest technicznie wykonywane za pomocą specjalnego rodzaju pliku nazwanego
potokiem (pipe). Powłoka tworzy taki plik (w RAMie), zastępuje
standardowe wyjście jednego programu tym plikiem oraz zastępuje standardowe
wejście drugiego programu tym samym plikiem. Odczyt z potoku blokuje się do
czasu aż pojawią się na nim dane lub aż wszyscy piszący do potoku go nie zamkną.
Składnia cmd_a | cmd_b
łączy standardowe wyjście cmd_a ze
standardowym wejściem cmd_b.
Takie komendy są uruchamiane współbieżnie.
Programy trzymające się "filozofii UNIX'a" czytają z plików o ile podano je w
argumentach lub ze standardowego wejścia jeśli nie podano plików w argumentach.
Dodatkowo standardowe wejście jest używane ilekroć -
pojawia się w kontekście
nazwy pliku.
Do wykonania cmd_a | cmd_b
powłoka tworzy potok nienazwany
(anonimowy).
Można stworzyć potok nazwany używając komendy mkfifo nazwa_pliku
.
Dane zapisane do potoków, zarówno nazwanego jak i anonimowego, są przechowywane
w pamięci operacyjnej – nie są zapisywane na dysk. Odczytanie danych z potoku
usuwa je z pamięci.
user@host ~ $ hexdump -C f | column 00000000 41 6e 64 20 74 68 65 6e 20 74 68 65 72 65 20 77 |And then there w| 00000060 68 61 64 20 74 72 61 69 6e 65 72 20 77 68 65 65 |had trainer whee| 00000010 65 72 65 20 74 68 65 20 66 72 6f 67 73 2e 0a 56 |ere the frogs..V| 00000070 6c 73 20 6f 6e 20 69 74 2e 0a 20 20 20 20 20 20 |ls on it.. | 00000020 65 72 79 2c 20 76 65 72 79 20 73 6d 61 6c 6c 20 |ery, very small | 00000080 20 20 2d 2d 20 28 54 65 72 72 79 20 50 72 61 74 | -- (Terry Prat| 00000030 66 72 6f 67 73 2e 0a 54 68 65 79 20 68 61 64 20 |frogs..They had | 00000090 63 68 65 74 74 2c 20 57 69 6e 67 73 29 0a |chett, Wings).| 00000040 73 75 63 68 20 61 20 74 69 6e 79 20 6c 69 66 65 |such a tiny life| 0000009e 00000050 20 63 79 63 6c 65 20 69 74 20 73 74 69 6c 6c 20 | cycle it still | user@host ~ $ echo '1 2 3 * + p' | dc # dc is a RPN calculator 7 user@host ~ $ figlet -f small Ribbit-ribbit. | cowsay -nf bud-frogs | cat -n 1 _____________________________________________________ 2 / ___ _ _ _ _ _ _ _ _ _ _ \ 3 | | _ (_) |__| |__(_) |_ ___ _ _(_) |__| |__(_) |_ | 4 | | / | '_ \ '_ \ | _|___| '_| | '_ \ '_ \ | _|_ | 5 | |_|_\_|_.__/_.__/_|\__| |_| |_|_.__/_.__/_|\__(_) | 6 \ / 7 ----------------------------------------------------- 8 \ 9 \ 10 oO)-. .-(Oo 11 /__ _\ /_ __\ 12 \ \( | ()~() | )/ / 13 \__|\ | (-___-) | /|__/ 14 ' '--' ==`-'== '--' ' user@host ~ $ seq 30 | paste - - - # paste reads input files rount-robin, "-" is the standard input 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 user@host ~ $ mkfifo rura ┍ drugi terminal ┍ trzeci terminal user@host ~ $ fortune > rura │ user@host ~ $ date > rura │ user@host ~ $ cat < rura user@host ~ $ │ user@host ~ $ │ BOFH Excuse #156: │ │ │ │ Zombie processes haunting the computer │ │ nie, 1 sty 2023, 00:00:00 CET
Zadanie 26 Wykonaj echo '2+2*2'
. Potem wynik tego polecenia przekaż przez potok do bc
.
Zadanie 27 Użyj echo
do wyświetlenia jakiegoś teksu. Potem powtórz komendę
przekazując jej wynik w potoku do xxd
.
Zadanie 28 Wypisz listę plików w katalogu domowym.
Powtórz komendę przekazując w potoku jej wyniki do programu cat
.
Dodaj na koniec poprzedniej komendy przekazanie jej wyniku do cat -n
.
Zadanie 29 Połącz w potok komendy ps -eF
i fold
Zadanie 30 Stwórz nazwany potok p. Przekieruj wejście programu fold
z p w jednym terminalu, a w drugim przekieruj wyjście ps -eF
do p.
Powtórz komendy wykonując ps
przed fold
.
Bash (i wiele innych programów) korzysta do odczytywania komend ze standardowego wejścia biblioteki readline.
Część programów z przyczyn licencyjnych wybiera do tego samego celu libedit.
Readline pozwala na wygodną edycję linii poleceń i tworzenie historii poleceń.
Lista sensownych skrótów klawiszowych do edycji linii poleceń (nie uwzględniająca strzałek) jest tutaj: https://readline.kablamo.org/emacs.html
Pełna lista komend i przypisanych do nich skrótów jest w podręczniku systemowym
(man readline
i man bash
).
Konwencja zapisu skrótów klawiszowych to:
^x
lub C-x
to Ctrl+x (uwaga:^X
lub C-X
to Ctrl+Shift+x),M-x
to zwykle Alt-x (patrz: https://en.wikipedia.org/wiki/Meta_key),a b
to wciśnięcie po skrócie a skrótu b.
Bash domyślnie dopisuje historię wykonanych poleceń do pliku ~/.bash_history
w momencie wyjścia z powłoki.
Historię (tą z pliku połączoną z bieżącą) można wyświetlić komendą history
. (W man bash_builtins
znajduje się opis przełączników.)
Do wygodnego przeglądania historii można też użyć programu hstr
Zadanie 31 Jakim skrótem czyści się ekran?
Zadanie 32 Jakimi skrótami wyszukuje się wstecz w historii?
Zadanie 33 Jakim skrótem przesuwa się kursor o jedno słowo?
Zadanie 34 Jakim złożeniem skrótów przesuwa się kursor o 5 słów?
Zadanie 35 Jakim skrótów wstawia się ostatnie słowo z poprzedniego polecenia w historii?
Zadanie 36 Jakim złożeniem skrótów wstawia się trzecie od końca słowo z poprzedniego polecenia w historii?
Zadanie 37 Jakim skrótem zamienia się kolejnością to słowo z poprzednim?
vi
jest często jedynym domyślnie instalowanym edytorem tekstowym.
vim
to ulepszona wersja vi
.
Żeby nauczyć się vim
, uruchom vimtutor
.
vi
jest wpisane w standard POSIX.
Jest też częścią minimalistycznych zestawów narzędzi takich jak busybox i toybox.
Zadanie 38 Przejdź całą pierwszą lekcję w vimtutor
.
Zadanie 39 Przejdź pozostałe lekcje w vimtutor
.
Nano jest stosunkowo prostym edytorem tekstowym.
Podstawowe skróty są wyświetlone na dole ekranu.
Więcej na: https://www.nano-editor.org/docs.php
Emacs jest odwiecznym rywalem vim
a w konkurencji programów do edytowania tekstu w konsoli.
Po wpisaniu emacs
możesz wybrać tutorial skrótem Ctrl+h t.
\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
.