Download: LinuxUser_przekierowania

Transkrypt

Download: LinuxUser_przekierowania
LINUX USER
Wiersz poleceń
Kanały, potoki i tee
Przekierowania
Łączenie wyników komend wydawanych z listy poleceń nie jest trudne.
Można tego dokonać przekierowując ich wejścia/wyjścia. W tym miesiącu
przyjrzymy się bliżej koniecznym do tego operatorom Bash-a i zademonstrujemy użycie polecenia tee, jako kroku pośredniego.
HEIKE JURZIK
K
olumna „Wiersz poleceń” opisuje
techniki konieczne do inteligentnego łączenia różnych uniksowych
programów-klocków. Ważnym elementem
tej wiedzy jest korzystanie z operatorów
przekierowania. W tym artykule będziemy
badać funkcjonowanie tych operatorów od
wewnątrz.
Trzy kanały
Istnieją trzy standardowe kanały wejścia
i wyjścia programu. Działające programy
oczekują danych ze standardowego wejścia
(stdin), to jest z klawiatury. Program wysyła dane na standardowe wyjście (stdout) –
jest nim zazwyczaj okno terminala, w którym uruchomiliśmy program. Istnieje także standardowy kanał błędów (stderr), którego wyjście jest takie same, jak w przypadku standardowego wyjścia. Dzięki temu
uzyskujemy informację o ewentualnych
błędach, a zarazem podpowiedź, jak rozwiązać napotkany problem. Tak zwane de skryptory pliku są wykorzystywane do
wskazywania tych trzech kanałów. Standardowe kanały są ponumerowane: stdin ma
#0, stdout #1, a stderr ma #2.
Wyjście zwykłego programu pokazuje
się w oknie terminala – jest to znak zachęty „pytający”, czy na pewno chcemy uruchomić program. Program odczytuje odpowiedź ze standardowego wejścia, czyli
z klawiatury. Po potwierdzeniu pokazuje
się komunikat błędu mówiący, że nie mamy uprawnień root-a. Program reiserfsck
96
Lipiec 2004
wysyła wiadomość na standardowe wyjście błędu.
Oto kolejny, mało skomplikowany przykład – tym razem używamy polecenia grep:
hj@asteroid:~$ grep blah *
file1:blah
file2:blah blah
grep: dir: Is a directory
W naszym przykładzie komenda grep przegląda wszystkie pliki w poszukiwaniu słowa
blah. Wynik stanowią pliki file1 i file2.
W przypadku natrafienia na katalog dir,
zwracane jest ostrzeżenie. Bardziej aktualne wersje grep ignorują katalogi bez komentarza, mimo to grep Debian Linux
2.4.2, użyty w tym przykładzie, nie akceptuje katalogów.
W którym kierunku?
Programy nie dbają o to, skąd komendy
przychodzą, ani gdzie znajdzie się ich wyjście. Specjalne operatory pozwalają na
przeorganizowanie standardowych kanałów. Możesz wykorzystać operator >, aby
uniknąć wysyłania standardowego wyjścia
na konsolę.
hj@asteroid:~$ grep blah * U
> grep_results
grep: dir: Is a directory
Zamiast operatora > możesz użyć 1>. Tak
jak wspomniano poprzednio, 1 jest deskryptorem pliku przypisanym do standardowego
wyjścia. Jeśli pominiesz 1, stdout jest przyjmowane jako domyślne. Mimo że rezultaty
komendy grep są wysyłane do pliku nazwanego grep_results, komunikaty błędów wciąż
pokazują się w konsoli. Jeśli wolisz zatrzymać
standardowe wyjście, a przekierować standardowe wyjście błędu, wypróbuj operator 2>:
hj@asteroid:~$ grep blah * U
2> grep_error
file1:blah
file2:blah blah
Jeśli nie potrzebujesz korzystać z wyjścia
błędu, możesz je przekierować na /dev/null
zamiast do pliku. Ten pseudoplik nie ma
zawartości. Wszystkie dane wysłane do niego zostają odrzucone, dzięki czemu możesz
usunąć niechciane komunikaty błędów:
grep blah * 2> /dev/null
Przykład 1: Współpraca różnych kanałów 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 również odpowiedni plik lub
nadpisuje istniejący plik z określoną nazwą. Alternatywnie można wykorzystać
operator >. W tym przypadku tworzony
jest nowy plik lub wyjście jest dopisywane
na koniec istniejącego już pliku.
Operator >& umożliwia przekierowanie
standardowego wyjścia i standardowego
wyjścia błędów do pojedynczego pliku:
grep blah * >& grep_results
Wejście
Poza przekierowaniem wyjścia, można również przekierować wejście. Potrzebny jest
operator <i>. Na przykład komenda nie
musi koniecznie czytać wejścia z klawiatury, równie dobrze może też przetwarzać pliki. Jest to całkiem użyteczne dla komendy
mail. Aby wysłać tekst zapisany uprzednio
w pliku tekstowym do użytkownika o nazwie petronella, należy wprowadzić:
mail -s „list” U
petronella < tekstlistu
Komenda ta w pierwszej kolejności ustawia
temat listu, wykorzystując opcję -s. Następnie mail wysyła 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 użytkownika (przedstawionym jako symbol tyldy
~), badając ile miejsca zajmują pliki. W celu uzyskania informacji, który plik zajmuje
najwięcej miejsca, można przekierować wyjście komendy du na wejście komendy sort.
Parametry -r i -n spowodują, że wyjście pojawi się w odwróconym porządku, posortowanym według wartości liczbowych łańcuchów. Drugi znak potoku spowoduje, że
wyjście zostanie podzielone na strony.
Czas na tee
W przypadku komend korzystających ze
złożonych potoków, tee jest bardzo użytecznym narzędziem. Jak sama nazwa wskazuje, tee jest rodzajem trójnika łączącego dwa
potoki – spodziewa się danych ze standardowego wejścia i przekazuje je niezmienione na standardowe wyjście, kopiując w międzyczasie dane do wybranego pliku. Typowa składnia tee wygląda następująco:
W górę i w dół potoku
LINUX USER
SŁOWNICZEK
Deskryptor pliku: W systemie Linux każdy
proces obejmuje też otwarte pliki. Każdy
z nich ma unikalny, dodatni numer. Numer ten jest często określany jako deskryptor pliku. Deskryptory 0, 1 i 2 są generowane automatycznie. Każdy proces
jest uruchamiany z otwartymi kanałami
standardowego wejścia, wyjścia i błędu
(patrz Przykład 1).
obecność wystąpienia słowa „huhn”. Polecenie tee powoduje, że wyjście zostanie wysłane najpierw do pliku loggedon.txt.
Program tee posiada dwie interesujące
opcje: -a („append”) umożliwiającą dołączanie danych do istniejącego pliku. Bez tej
opcji tee przy każdym wywołaniu nadpisze
plik. Opcja -i zabezpiecza przed przedwczesnym zakończeniem polecenia tee, jeżeli w strumieniu danych pojawi się znak
zatrzymania ([Ctrl c]).
tee jest często używany w przypadku wielu komend w potoku. Zapisując wyjścia
w tymczasowych plikach, możesz go użyć
do rozwiązywania skomplikowanych problemów i błędów. Gdy wszystko będzie
działało poprawnie, możesz oczywiście usunąć złączenia tee. Innym zastosowaniem
tee jest rejestrowanie w pliku wyjścia zajmującej dużo czasu komendy.
tee [-opcje] plik
Możemy wykorzystać znak potoku ('|') do
połączenia wejściowych i wyjściowych strumieni. W ten sposób tworzymy łańcuchy
poleceń. Wyświetlmy wyjście komendy ls -l
/etc/*
Możesz wstawić trójnik w potok między
dwoma komendami. Program tee przejmie
wyjście z pierwszej komendy, a następnie
przekieruje je do pliku i do kolejnej komendy w potoku:
ls -l /etc/* | less
Bez przekierowania wyjście komendy ls
spowoduje przewinięcie okna terminala.
Istnieje również możliwość połączenia całego szeregu potoków:
hj@asteroid:~$ du ~ | U
hj@asteroid:~$ who | tee U
loggedon.txt | grep huhn
huhn:0 Apr 29 13:45
who jest komendą sprawdzającą, kto jest
zalogowany w systemie. grep sprawdza
tar cvf backup.tar *U
| tee backup.log
Komenda ta tworzy plik dziennika podczas tworzenia archiwum tar, umożliwiając późniejsze sprawdzenie poprawności
jego utworzenia. Przekierowanie wyjścia
komendy tar do pliku, tak jak w przypadku > backup.log, zapobiega niekontrolowanemu wyświetleniu na oknie terminala
treści pliku. Wykorzystując tail -f backup.log możesz obserwować działanie 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