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).