Unix / Linux - przekierowania wejścia / wyjścia powłoki
W tym rozdziale omówimy szczegółowo przekierowania wejścia / wyjścia powłoki. Większość poleceń systemu Unix pobiera dane wejściowe z terminala i wysyła wynikowe dane wyjściowe z powrotem do terminala. Polecenie normalnie czyta swoje dane wejściowe ze standardowego wejścia, którym domyślnie jest twój terminal. Podobnie, polecenie normalnie wypisuje swoje dane wyjściowe na standardowe wyjście, które domyślnie jest znowu twoim terminalem.
Przekierowanie wyjścia
Wyjście polecenia normalnie przeznaczonego na standardowe wyjście można łatwo przekierować do pliku. Ta funkcja jest znana jako przekierowanie wyjścia.
Jeśli notation> file zostanie dołączony do dowolnego polecenia, które normalnie zapisuje swoje dane wyjściowe na standardowe wyjście, wynik tego polecenia zostanie zapisany do pliku zamiast na terminalu.
Sprawdź, co następuje who polecenie, które przekierowuje pełne dane wyjściowe polecenia w pliku użytkowników.
$ who > users
Zwróć uwagę, że na terminalu nie pojawiają się żadne dane wyjściowe. Dzieje się tak, ponieważ dane wyjściowe zostały przekierowane z domyślnego standardowego urządzenia wyjściowego (terminala) do określonego pliku. Możesz sprawdzić plik użytkowników pod kątem pełnej zawartości -
$ cat users
oko tty01 Sep 12 07:30
ai tty15 Sep 12 13:32
ruth tty21 Sep 12 10:10
pat tty24 Sep 12 13:07
steve tty25 Sep 12 13:03
$
Jeśli dane wyjściowe polecenia są przekierowane do pliku, a plik zawiera już pewne dane, dane te zostaną utracone. Rozważmy następujący przykład -
$ echo line 1 > users
$ cat users
line 1
$
Możesz użyć operatora >>, aby dołączyć dane wyjściowe do istniejącego pliku w następujący sposób -
$ echo line 2 >> users
$ cat users
line 1
line 2
$
Przekierowanie danych wejściowych
Tak jak dane wyjściowe polecenia mogą zostać przekierowane do pliku, tak samo wejście polecenia może zostać przekierowane z pliku. Ponieważgreater-than character > jest używany do przekierowania wyjścia, plik less-than character < służy do przekierowania wejścia polecenia.
Polecenia, które normalnie pobierają dane wejściowe ze standardowego wejścia, mogą mieć przekierowane dane wejściowe z pliku w ten sposób. Na przykład, aby policzyć liczbę wierszy w pliku wygenerowanym przez użytkowników powyżej, możesz wykonać polecenie w następujący sposób -
$ wc -l users
2 users
$
Po wykonaniu otrzymasz następujące dane wyjściowe. Możesz policzyć liczbę wierszy w pliku, przekierowując standardowe wejściewcpolecenie z pliku użytkownicy -
$ wc -l < users
2
$
Zauważ, że istnieje różnica w wynikach generowanych przez dwie formy polecenia wc. W pierwszym przypadku nazwa użytkownika pliku jest wyświetlana wraz z liczbą linii; w drugim przypadku tak nie jest.
W pierwszym przypadku wc wie, że odczytuje dane wejściowe od użytkowników pliku. W drugim przypadku wie tylko, że czyta swoje wejście ze standardowego wejścia, więc nie wyświetla nazwy pliku.
Tutaj Dokument
ZA here document służy do przekierowania danych wejściowych do interaktywnego skryptu lub programu powłoki.
Możemy uruchomić program interaktywny w skrypcie powłoki bez działania użytkownika, dostarczając wymagane dane wejściowe dla programu interaktywnego lub interaktywnego skryptu powłoki.
Ogólny formularz dla here dokument to -
command << delimiter
document
delimiter
Tutaj powłoka interpretuje plik <<operator jako instrukcję odczytu danych wejściowych, dopóki nie znajdzie wiersza zawierającego określony separator. Wszystkie wiersze wejściowe, aż do wiersza zawierającego separator, są następnie wprowadzane na standardowe wejście polecenia.
Separator informuje powłokę, że plik heredokument został ukończony. Bez tego powłoka nadal odczytuje dane wejściowe w nieskończoność. Separator musi być pojedynczym słowem, które nie zawiera spacji ani tabulatorów.
Poniżej znajduje się wejście do polecenia wc -l policzyć całkowitą liczbę wierszy -
$wc -l << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
3
$
Możesz użyć here document wydrukować wiele wierszy za pomocą swojego skryptu w następujący sposób -
#!/bin/sh
cat << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
Po wykonaniu otrzymasz następujący wynik -
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
Poniższy skrypt uruchamia sesję z vi edytor tekstu i zapisuje dane wejściowe w pliku test.txt.
#!/bin/sh
filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands
Jeśli uruchomisz ten skrypt z vimem działającym jako vi, prawdopodobnie zobaczysz wyniki takie jak poniżej -
$ sh test.sh
Vim: Warning: Input is not from a terminal
$
Po uruchomieniu skryptu do pliku powinien zostać dodany następujący komunikat test.txt -
$ cat test.txt
This file was created automatically from
a shell script
$
Odrzuć dane wyjściowe
Czasami będziesz musiał wykonać polecenie, ale nie chcesz, aby dane wyjściowe były wyświetlane na ekranie. W takich przypadkach możesz odrzucić dane wyjściowe, przekierowując je do pliku/dev/null -
$ command > /dev/null
Tutaj polecenie to nazwa polecenia, które chcesz wykonać. Plik/dev/null to specjalny plik, który automatycznie odrzuca wszystkie dane wejściowe.
Aby odrzucić zarówno wyjście polecenia, jak i jego wyjście błędu, użyj przekierowania standardowego STDERR do STDOUT -
$ command > /dev/null 2>&1
Tutaj 2 reprezentuje STDERR i 1 reprezentuje STDOUT. Możesz wyświetlić wiadomość na STDERR, przekierowując STDOUT do STDERR w następujący sposób -
$ echo message 1>&2
Polecenia przekierowania
Poniżej znajduje się pełna lista poleceń, których można użyć do przekierowania -
Sr.No. | Polecenie i opis |
---|---|
1 | pgm > file Wyjście pgm jest przekierowywane do pliku |
2 | pgm < file Program pgm czyta swoje wejście z pliku |
3 | pgm >> file Wyjście pgm jest dołączane do pliku |
4 | n > file Dane wyjściowe ze strumienia z deskryptorem n przekierowany do pliku |
5 | n >> file Dane wyjściowe ze strumienia z deskryptorem n dołączone do pliku |
6 | n >& m Łączy dane wyjściowe ze strumienia n ze strumieniem m |
7 | n <& m Łączy dane wejściowe ze strumienia n ze strumieniem m |
8 | << tag Standardowe dane wejściowe przechodzą stąd przez następny znacznik na początku wiersza |
9 | | Pobiera dane wyjściowe z jednego programu lub procesu i wysyła je do innego |
Zauważ, że deskryptor pliku 0 jest zwykle standardowym wejściem (STDIN), 1 to standardowe wyjście (STDOUT), a 2 to standardowe wyjście błędów (STDERR).