co należy rozumieć przez połączenie STDOUT i STDIN?


10

Czytam książkę, mówi:

Każdy proces ma co najmniej trzy kanały komunikacji: „standardowe wejście” (STDIN), „standardowe wyjście” (STDOUT) i „standardowy błąd” (STDERR).

Większość poleceń akceptuje ich dane wejściowe ze STDIN i zapisuje swoje dane wyjściowe do STDOUT. Piszą komunikaty o błędach do STDERR. Ta konwencja pozwala łączyć ze sobą polecenia, takie jak bloki konstrukcyjne, w celu tworzenia złożonych rurociągów.

Powłoka interpretuje symbole <, >i >>jak instrukcje do przekierowania wejścia polecenia lub wyjście do lub z pliku.

Aby połączyć STDOUT jednego polecenia z STDIN drugiego, użyj | symbolu, zwanego potocznie potokiem.

ps -ef | grep httpd

Zasadniczo chodzi o to, że standardowe wejście to polecenie, które pozwala użytkownikowi na zapis do pliku, podczas gdy standardowe wyjście to polecenie, które ma wyjście zapisu powłoki powłoki bash do powłoki, a standardowy błąd jest podobny do wyjścia, ale jest tylko wywoływane, gdy wystąpi błąd w systemie plików. Następnie przechodzimy do połączenia STDOUT i STDIN i jestem zgubiony.

Odpowiedzi:


25

Standardowe wejście i standardowe wyjście nie są poleceniami.

Wyobraź sobie polecenia jako maszyny w fabryce z linią montażową. Większość maszyn jest zaprojektowana tak, aby mieć jeden przenośnik taśmowy do wprowadzania danych i jeden przenośnik taśmowy do podawania danych; są to odpowiednio standardowe wejście i standardowe wyjście. Standardowym błędem jest otwór z boku maszyny, w którym może on wyrzucać odrzuty.

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

Powyższy schemat pokazuje przenośnik taśmowy, który przechodzi przez dwie maszyny. Dane pochodzą ze zbiornika wejściowego po lewej stronie, są podawane do maszyny A, a następnie dane wyjściowe są przenoszone dalej do maszyny B (dla której są wprowadzane), a moc wyjściowa maszyny B jest umieszczana w pojemniku wyjściowym po prawej stronie.

W terminologii unix nazywa się to potokiem . Metaforą jest hydraulika: rura łączy maszynę A z maszyną B. Składnia powłoki dla powyższego rurociągu to

<input-file.txt commandA | commandB >output-file.txt

< Przekierowanie symbol mówi powłoce aby połączyć commandA„s standardowe wejście do pliku input-file.txtprzed uruchomieniem commandA. (Możesz umieścić przekierowanie przed lub po nazwie polecenia.) >Symbol przekierowania informuje powłokę, aby podłączyć commandBstandardowe wyjście output-file.txt. Symbol potoku („ |”) pośrodku informuje powłokę, aby podłączyć commandAstandardowe wyjście do commandBstandardowego wejścia przed ich uruchomieniem.

Polecenia mogą mieć więcej niż jedno wejście i więcej niż jedno wyjście, ale to jest ważne na inny dzień .



Niezła analogia. Zrozumiałem koncepcję rurociągu strumieniowego od wielu lat, ale jakoś nikt nigdy nie zastosował analogii fabryka / przenośnik, co sprawia, że ​​jest naprawdę łatwo (i zwięźle) zrozumiała. Dziękuję Ci!
Owen Blacker

1
Świetna analogia. Pożyczę ten, jeśli nie masz nic przeciwko.
Tivie

Gilles, zadałem pytanie dotyczące twojego sformułowania na dole: unix.stackexchange.com/q/96724/29146 . mógłbyś to wyjaśnić?
strugee,

@Gilles - Czy możesz podać przykład ilustrujący opcję zdefiniowania przekierowania przed lub po poleceniu? Na przykład, czy potok może odczytać jako plik wejściowy.txt> polecenieA lub plik wejściowy.txt <polecenie A?
Zmotywowany

6

standard input is a command that allows user to write to a file

Nie polecenie, ale strumień. Standardowe wejścia i wyjścia są jak skrzynki pocztowe. Kiedy program się uruchamia, otrzymuje on pole do odebrania i pole do wysłania poczty. Zazwyczaj dane wejściowe pochodzą z klawiatury i są umieszczane w skrzynce odbiorczej, poczta umieszczana w skrzynce odbiorczej kończy się na ekranie terminala.

standard output is a command that has the bash shell write output to the shell

Program tak naprawdę nie wie, gdzie wskazują standardowe punkty wyjściowe. Kiedy potokujesz od A do B (jak w $ A | B), kiedy A umieszcza pocztę w skrzynce nadawczej, kończy się w skrzynce odbiorczej B. B przetwarza dane wejściowe i umieszcza własną pocztę w skrzynce nadawczej, co widać na terminalu.

Aby upuścić metafor, jak wspomniano, standardowymi wejściami / wyjściami są strumienie. Skrzynka pocztowa lub deskryptor pliku to jeden koniec strumienia. Do rury należy podłączyć standard z A do standardu z B.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.