You are on page 1of 2

LINUX USER

Wiersz polece

Kanay, potoki i tee

Przekierowania
czenie wynikw komend wydawanych z listy polece nie jest trudne.
Mona tego dokona przekierowujc ich wejcia/wyjcia. W tym miesicu
przyjrzymy si bliej koniecznym do tego operatorom Bash-a i zademonstrujemy uycie polecenia tee, jako kroku poredniego.
HEIKE JURZIK

olumna Wiersz polece opisuje


techniki konieczne do inteligentnego czenia rnych uniksowych
programw-klockw. Wanym elementem
tej wiedzy jest korzystanie z operatorw
przekierowania. W tym artykule bdziemy
bada funkcjonowanie tych operatorw od
wewntrz.

Trzy kanay
Istniej trzy standardowe kanay wejcia
i wyjcia programu. Dziaajce programy
oczekuj danych ze standardowego wejcia
(stdin), to jest z klawiatury. Program wysya dane na standardowe wyjcie (stdout)
jest nim zazwyczaj okno terminala, w ktrym uruchomilimy program. Istnieje take standardowy kana bdw (stderr), ktrego wyjcie jest takie same, jak w przypadku standardowego wyjcia. Dziki temu
uzyskujemy informacj o ewentualnych
bdach, a zarazem podpowied, jak rozwiza napotkany problem. Tak zwane de skryptory pliku s wykorzystywane do
wskazywania tych trzech kanaw. Standardowe kanay s ponumerowane: stdin ma
#0, stdout #1, a stderr ma #2.
Wyjcie zwykego programu pokazuje
si w oknie terminala jest to znak zachty pytajcy, czy na pewno chcemy uruchomi program. Program odczytuje odpowied ze standardowego wejcia, czyli
z klawiatury. Po potwierdzeniu pokazuje
si komunikat bdu mwicy, e nie mamy uprawnie root-a. Program reiserfsck

96

Lipiec 2004

wysya wiadomo na standardowe wyjcie bdu.


Oto kolejny, mao skomplikowany przykad tym razem uywamy polecenia grep:
hj@asteroid:~$ grep blah *
file1:blah
file2:blah blah
grep: dir: Is a directory

W naszym przykadzie komenda grep przeglda wszystkie pliki w poszukiwaniu sowa


blah. Wynik stanowi pliki file1 i file2.
W przypadku natrafienia na katalog dir,
zwracane jest ostrzeenie. Bardziej aktualne wersje grep ignoruj katalogi bez komentarza, mimo to grep Debian Linux
2.4.2, uyty w tym przykadzie, nie akceptuje katalogw.

W ktrym kierunku?
Programy nie dbaj o to, skd komendy
przychodz, ani gdzie znajdzie si ich wyjcie. Specjalne operatory pozwalaj na
przeorganizowanie standardowych kanaw. Moesz wykorzysta operator >, aby
unikn wysyania standardowego wyjcia
na konsol.

hj@asteroid:~$ grep blah * U


> grep_results
grep: dir: Is a directory

Zamiast operatora > moesz uy 1>. Tak


jak wspomniano poprzednio, 1 jest deskryptorem pliku przypisanym do standardowego
wyjcia. Jeli pominiesz 1, stdout jest przyjmowane jako domylne. Mimo e rezultaty
komendy grep s wysyane do pliku nazwanego grep_results, komunikaty bdw wci
pokazuj si w konsoli. Jeli wolisz zatrzyma
standardowe wyjcie, a przekierowa standardowe wyjcie bdu, wyprbuj operator 2>:
hj@asteroid:~$ grep blah * U
2> grep_error
file1:blah
file2:blah blah

Jeli nie potrzebujesz korzysta z wyjcia


bdu, moesz je przekierowa na /dev/null
zamiast do pliku. Ten pseudoplik nie ma
zawartoci. Wszystkie dane wysane do niego zostaj odrzucone, dziki czemu moesz
usun niechciane komunikaty bdw:
grep blah * 2> /dev/null

Przykad 1: Wsppraca rnych kanaw we/wy


hj@asteroid:~$ /sbin/fsck /dev/hda7
Do you want to run this program?[N/Yes] : Yes
reiserfsck: Cannot not open filesystem on "/dev/hda7"
Warning... fsck.reiserfs for device /dev/hda7 exited with signal 6.

www.linux-magazine.pl

Wiersz polece

Operator > nie tylko przekierowuje.


Tworzy on rwnie odpowiedni plik lub
nadpisuje istniejcy plik z okrelon nazw. Alternatywnie mona wykorzysta
operator >. W tym przypadku tworzony
jest nowy plik lub wyjcie jest dopisywane
na koniec istniejcego ju pliku.
Operator >& umoliwia przekierowanie
standardowego wyjcia i standardowego
wyjcia bdw do pojedynczego pliku:
grep blah * >& grep_results

Wejcie
Poza przekierowaniem wyjcia, mona rwnie przekierowa wejcie. Potrzebny jest
operator <i>. Na przykad komenda nie
musi koniecznie czyta wejcia z klawiatury, rwnie dobrze moe te przetwarza pliki. Jest to cakiem uyteczne dla komendy
mail. Aby wysa tekst zapisany uprzednio
w pliku tekstowym do uytkownika o nazwie petronella, naley wprowadzi:
mail -s list U
petronella < tekstlistu

Komenda ta w pierwszej kolejnoci ustawia


temat listu, wykorzystujc opcj -s. Nastpnie mail wysya plik tekstlistu odczytany
przy pomocy operatora <i>.

sort -rn | less


15237932 /home/huhn
1598024 /home/huhn/digicam
1518428 /home/huhn/uni
1500236 /home/huhn/tmp
1246740 /home/huhn/uni/english
[...]

Komenda du najpierw sprawdza wszystkie


podkatalogi w katalogu domowym uytkownika (przedstawionym jako symbol tyldy
~), badajc ile miejsca zajmuj pliki. W celu uzyskania informacji, ktry plik zajmuje
najwicej miejsca, mona przekierowa wyjcie komendy du na wejcie komendy sort.
Parametry -r i -n spowoduj, e wyjcie pojawi si w odwrconym porzdku, posortowanym wedug wartoci liczbowych acuchw. Drugi znak potoku spowoduje, e
wyjcie zostanie podzielone na strony.

Czas na tee
W przypadku komend korzystajcych ze
zoonych potokw, tee jest bardzo uytecznym narzdziem. Jak sama nazwa wskazuje, tee jest rodzajem trjnika czcego dwa
potoki spodziewa si danych ze standardowego wejcia i przekazuje je niezmienione na standardowe wyjcie, kopiujc w midzyczasie dane do wybranego pliku. Typowa skadnia tee wyglda nastpujco:

W gr i w d potoku

LINUX USER

SOWNICZEK
Deskryptor pliku: W systemie Linux kady
proces obejmuje te otwarte pliki. Kady
z nich ma unikalny, dodatni numer. Numer ten jest czsto okrelany jako deskryptor pliku. Deskryptory 0, 1 i 2 s generowane automatycznie. Kady proces
jest uruchamiany z otwartymi kanaami
standardowego wejcia, wyjcia i bdu
(patrz Przykad 1).

obecno wystpienia sowa huhn. Polecenie tee powoduje, e wyjcie zostanie wysane najpierw do pliku loggedon.txt.
Program tee posiada dwie interesujce
opcje: -a (append) umoliwiajc doczanie danych do istniejcego pliku. Bez tej
opcji tee przy kadym wywoaniu nadpisze
plik. Opcja -i zabezpiecza przed przedwczesnym zakoczeniem polecenia tee, jeeli w strumieniu danych pojawi si znak
zatrzymania ([Ctrl c]).
tee jest czsto uywany w przypadku wielu komend w potoku. Zapisujc wyjcia
w tymczasowych plikach, moesz go uy
do rozwizywania skomplikowanych problemw i bdw. Gdy wszystko bdzie
dziaao poprawnie, moesz oczywicie usun zczenia tee. Innym zastosowaniem
tee jest rejestrowanie w pliku wyjcia zajmujcej duo czasu komendy.

tee [-opcje] plik

Moemy wykorzysta znak potoku ('|') do


poczenia wejciowych i wyjciowych strumieni. W ten sposb tworzymy acuchy
polece. Wywietlmy wyjcie komendy ls -l
/etc/*

Moesz wstawi trjnik w potok midzy


dwoma komendami. Program tee przejmie
wyjcie z pierwszej komendy, a nastpnie
przekieruje je do pliku i do kolejnej komendy w potoku:

ls -l /etc/* | less

Bez przekierowania wyjcie komendy ls


spowoduje przewinicie okna terminala.
Istnieje rwnie moliwo poczenia caego szeregu potokw:
hj@asteroid:~$ du ~ | U

hj@asteroid:~$ who | tee U


loggedon.txt | grep huhn
huhn:0 Apr 29 13:45

who jest komend sprawdzajc, kto jest


zalogowany w systemie. grep sprawdza

tar cvf backup.tar *U


| tee backup.log

Komenda ta tworzy plik dziennika podczas tworzenia archiwum tar, umoliwiajc pniejsze sprawdzenie poprawnoci
jego utworzenia. Przekierowanie wyjcia
komendy tar do pliku, tak jak w przypadku > backup.log, zapobiega niekontrolowanemu wywietleniu na oknie terminala
treci pliku. Wykorzystujc tail -f backup.log moesz obserwowa dziaanie tar
w osobnym oknie terminala.

Linux Lunacy 04
CRUISE

THE

EASTERN

MEDITERRANEAN

7 Night Cruise Departs October 10, 2004


Internationally-renowned authors & speakers
SPONSORED

BY:

LINUX

MAGAZINE

www.geekcruises.com

www.linux-magazine.pl

Lipiec 2004

97

You might also like