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