Przekierowanie (obliczenia) - Redirection (computing)

Standardowe strumienie danych wejściowych, wyjściowych i błędów

W komputerowych , przekierowania jest formą międzyprocesową komunikacji i jest wspólny dla wielu funkcji tłumaczy polecenia linii , w tym różne powłoki Unix , który może przekierować standardowe strumienie w lokalizacjach określonych przez użytkownika.

W uniksopodobnych systemach operacyjnych programy dokonują przekierowania za pomocą wywołania systemowego dup2 (2) lub jego mniej elastycznych, ale wyższego poziomu analogów stdio , freopen (3) i popen (3) .

Przekierowywanie standardowego wejścia i standardowego wyjścia

Przekierowanie jest zwykle realizowane przez umieszczenie określonych znaków między poleceniami .

Podstawowy

Zazwyczaj składnia tych znaków jest następująca: użycie <do przekierowania wejścia i >do przekierowania wyjścia. command > file1Wykonuje Command1 , umieszczając wyjście w plik1 , w przeciwieństwie do wyświetlania go w terminalu, który jest zwykle miejscem na standardowe wyjście. Spowoduje to zniszczenie wszystkich istniejących danych w pliku1 .

Użycie powodujecommand < file1 wykonanie polecenia 1 , ze źródłem wejścia plik1 , w przeciwieństwie do klawiatury , która jest zwykłym źródłem standardowego wejścia.

command < infile > outfilełączy w sobie dwie funkcje: command1 czyta z pliku wejściowego i zapisuje outfile

Warianty

Aby dołączyć dane wyjściowe na końcu pliku, zamiast go zatykać, >>używa się operatora: command1 >> file1.

Aby odczytać z literału strumieniowego (pliku wbudowanego, przekazanego na standardowe wejście), można użyć dokumentu tutaj , używając <<operatora:

$ tr a-z A-Z << END_TEXT
> one two three
> uno dos tres
> END_TEXT
ONE TWO THREE
UNO DOS TRES

Aby odczytać z napisu, można użyć napisu here , używając <<<operatora: , lub: tr a-z A-Z <<< "one two three"

$ NUMBERS="one two three"
$ tr a-z A-Z <<< "$NUMBERS"
ONE TWO THREE

Rurociąg

Potok trzech programów uruchamianych na terminalu tekstowym

Programy mogą być uruchamiane razem w taki sposób, że jeden program odczytuje dane wyjściowe z innego bez potrzeby jawnego pliku pośredniego. Wykonuje Command1 za pomocą jej wyjście jako wejście command2 (powszechnie zwane przewody , z „ ” postać znaną jako „rura”). command1 | command2|

Dwa programy wykonujące polecenia mogą działać równolegle, a jedyną przestrzenią do przechowywania są bufory robocze (Linux pozwala na maksymalnie 64 KB dla każdego bufora) oraz dowolna przestrzeń robocza, jakiej wymaga przetwarzanie każdego polecenia. Na przykład polecenie „sortuj” nie może wygenerować żadnych danych wyjściowych, dopóki wszystkie rekordy wejściowe nie zostaną odczytane, ponieważ ostatni odebrany rekord może okazać się pierwszy w kolejności sortowania. Eksperymentalny system operacyjny dr Alexii Massalin, Synthesis , dopasowywał priorytet każdego zadania w miarę ich wykonywania zgodnie z zapełnieniem ich buforów wejściowych i wyjściowych.

Daje to taki sam wynik końcowy, jak użycie dwóch przekierowań i pliku tymczasowego, jak w:

$ command1 > tempfile
$ command2 < tempfile
$ rm tempfile

Ale tutaj, command2 nie rozpocznie wykonywania aż polecenie1 zakończył i wystarczająco duży plik na zarysowania jest wymagane do przechowywania wyników pośrednich, jak również wszelkie prace wymagana przestrzeń każde zadanie. Jako przykład, chociaż DOS dopuszcza składnię "potoku", wykorzystuje to drugie podejście. Załóżmy zatem, że jakiś długo działający program „Worker” generuje różne komunikaty podczas pracy, a drugi program, TimeStamp, kopiuje każdy rekord z stdin na stdout , poprzedzony datą i godziną odebrania rekordu w systemie. Sekwencja taka, jaka dawałaby znaczniki czasu dopiero po zakończeniu pracy robota, pokazująca jedynie, jak szybko można odczytać i zapisać plik wyjściowy. Worker | TimeStamp > LogFile.txt

Dobrym przykładem potoku poleceń jest łączenie echoz innym poleceniem w celu uzyskania czegoś interaktywnego w nieinteraktywnej powłoce, np . . To uruchamia klienta ftp z podaniem użytkownika , naciśnij return , a następnie pass . echo -e 'user\npass' | ftp localhost

W zwykłym użyciu, początkowym krokiem potoku jest często catlub echo, czytanie z pliku lub łańcucha. Często może być zastąpione przez wejście pośrednie lub ciąg znaków here , a użycie cat i piping zamiast przekierowania wejścia jest znane jako bezużyteczne użycie cat . Na przykład następujące polecenia:

$ cat infile | command
$ echo $string | command
$ echo -e 'user\npass' | ftp localhost

można zastąpić:

$ command < infile
$ command <<< $string
$ ftp localhost <<< $'user\npass'

Jak echoczęsto jest to polecenie wewnętrzne powłoki, jego użycie nie jest tak krytykowane jak cat, który jest poleceniem zewnętrznym.

Przekierowywanie do i ze standardowych uchwytów plików

W powłokach uniksowych wywodzących się z oryginalnej powłoki Bourne'a pierwsze dwie akcje mogą być dalej modyfikowane przez umieszczenie liczby ( deskryptora pliku ) bezpośrednio przed znakiem ; wpłynie to na strumień używany do przekierowania. Standardowe strumienie we/wy Unix to:

Uchwyt Nazwa Opis
0 stdin Wejście standardowe
1 stdout Wyjście standardowe
2 stderr Standardowy błąd

Na przykład wykonuje polecenie , kierując standardowy strumień błędów do pliku1 . command 2> file1

W powłokach wywodzących się z csh ( powłoka C ) składnia zamiast tego dołącza znak & (ampersand) do znaków przekierowania, uzyskując w ten sposób podobny wynik. Powodem tego jest rozróżnienie między plikiem o nazwie '1' i stdout, tj . vs . W pierwszym przypadku stderr jest przekierowywane do pliku o nazwie ' 1 ', aw drugim stderr jest przekierowywane do stdout. cat file 2>1cat file 2>&1

Inną przydatną możliwością jest przekierowanie jednego standardowego uchwytu pliku do innego. Najpopularniejszą odmianą jest scalanie standardowego błędu ze standardowym wyjściem, dzięki czemu komunikaty o błędach mogą być przetwarzane razem ze zwykłym wyjściem (lub alternatywnie do niego). Na przykład spróbuje znaleźć wszystkie pliki o nazwie .profile . Wykonywany bez przekierowania, wypisze trafienia na standardowe wyjście i błędy (np. brak uprawnień do przechodzenia chronionych katalogów) na stderr . Jeśli standardowe wyjście jest kierowane do pliku wyników , w konsoli pojawiają się komunikaty o błędach. Aby zobaczyć zarówno trafienia, jak i komunikaty o błędach w wynikach pliku , połącz stderr (obsługa 2) ze stdout (obsługa 1) za pomocą . find / -name .profile > results 2>&12>&1

Jeśli scalone wyjście ma zostać przesłane do innego programu, sekwencja scalania plików 2>&1musi poprzedzać symbol potoku, a zatem:find / -name .profile 2>&1 | less

Uproszczona, ale niezgodna z POSIX forma polecenia to (niedostępna w Bourne Shell przed wersją 4, wydaniem końcowym lub w standardowej powłoce Debiana Almquist używanej w Debianie/Ubuntu): lub . command > file 2>&1command &>filecommand >&file

Można użyć 2>&1przed „ >”, ale wynik jest często źle rozumiany. Zasadą jest, że każde przekierowanie niezależnie ustawia uchwyt do strumienia wyjściowego. Tak więc 2>&1ustawia uchwyt 2na dowolny uchwyt 1, na który wskazuje uchwyt , którym w tym momencie jest zwykle stdout . Następnie " >" przekierowuje uchwyt 1do czegoś innego , np. pliku , ale nie zmienia uchwytu 2, który nadal wskazuje na standardowe wyjście .

W poniższym przykładzie standardowe wyjście jest zapisywane do pliku , ale błędy są przekierowywane z stderr na stdout, czyli wysyłane na ekran: . command 2>&1 > file

Aby zapisać zarówno błędy, jak i standardowe wyjście do pliku , należy odwrócić kolejność. Standardowe wyjście zostanie najpierw przekierowane do pliku, a następnie stderr zostanie dodatkowo przekierowane do uchwytu stdout, który został już zmieniony tak, aby wskazywał na plik: . command > file 2>&1

Rurociągi łańcuchowe

Tokeny przekierowania i potoków można łączyć ze sobą w celu tworzenia złożonych poleceń. Na przykład sortuje wiersze pliku infile w porządku leksykograficznym, zapisuje unikatowe wiersze poprzedzone liczbą wystąpień, sortuje wynikowe dane wyjściowe numerycznie i umieszcza końcowe dane wyjściowe w pliku outfile . Ten typ konstrukcji jest bardzo często używany w skryptach powłoki i plikach wsadowych . sort infile | uniq -c | sort -n > outfile

Przekieruj do wielu wyjść

Standardowa koszulka poleceń może przekierować wyjście z polecenia do kilku miejsc docelowych: . Kieruje to wyjście listy plików zarówno na standardowe wyjście, jak i na plik xyz . ls -lrt | tee xyz

Zobacz też

Zewnętrzne linki