Przekierowanie (obliczenia) - Redirection (computing)
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 > file1
Wykonuje 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
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 echo
z 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 cat
lub 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 echo
czę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>1
cat 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>&1
2>&1
Jeśli scalone wyjście ma zostać przesłane do innego programu, sekwencja scalania plików 2>&1
musi 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>&1
command &>file
command >&file
Można użyć 2>&1
przed „ >
”, 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>&1
ustawia uchwyt 2
na dowolny uchwyt 1
, na który wskazuje uchwyt , którym w tym momencie jest zwykle stdout . Następnie " >
" przekierowuje uchwyt 1
do 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ż
- Here-document , sposób określania tekstu do wprowadzenia w powłokach wiersza poleceń
- Łopata do muszli
- Zastępowanie poleceń
- Zastępowanie procesu
Zewnętrzne linki
- The Single UNIX Specification , wydanie 7 z The Open Group : duplikat otwartego deskryptora pliku – System Interfaces Reference,
- Definicja przekierowania przez The Linux Information Project (LINFO)
- Przekierowanie we /wy w projekcie dokumentacji systemu Linux
- Przekierowanie w systemie Windows
- Tworzenie procesu potomnego z przekierowanymi danymi wejściowymi i wyjściowymi w systemie Windows