có nghĩa là gì khi kết nối STDOUT và STDIN?


10

Tôi đang đọc một cuốn sách, nó nói:

Mọi quy trình đều có ít nhất ba kênh liên lạc có sẵn: Đầu vào tiêu chuẩn, (STDIN), đầu ra tiêu chuẩn, (STDOUT), và tiêu chuẩn lỗi (STDERR).

Hầu hết các lệnh chấp nhận đầu vào của chúng từ STDIN và ghi đầu ra của chúng vào STDOUT. Họ viết thông báo lỗi cho STDERR. Quy ước này cho phép bạn xâu chuỗi các lệnh lại với nhau như các khối xây dựng để tạo các đường ống tổng hợp.

Vỏ giải thích những biểu tượng <, >>>như hướng dẫn để định tuyến lại đầu vào hay đầu ra của lệnh đến hoặc từ một tập tin.

Để kết nối STDOUT của một lệnh với STDIN của lệnh khác, hãy sử dụng | ký hiệu, thường được gọi là đường ống.

ps -ef | grep httpd

Vì vậy, về cơ bản điều này đang nói là đầu vào tiêu chuẩn là một lệnh cho phép người dùng ghi vào một tệp, trong khi đầu ra tiêu chuẩn là một lệnh có đầu ra ghi bash shell vào vỏ và lỗi tiêu chuẩn giống như đầu ra nhưng nó chỉ là được gọi khi có lỗi trong hệ thống tập tin. Sau đó, chúng tôi đến phần kết nối STDOUT và STDIN và tôi bị mất.

Câu trả lời:


25

Đầu vào tiêu chuẩn và đầu ra tiêu chuẩn không phải là lệnh.

Hãy tưởng tượng các lệnh như các máy trong một nhà máy với một dây chuyền lắp ráp. Hầu hết các máy được thiết kế để có một băng chuyền để cung cấp dữ liệu và một băng chuyền để cung cấp dữ liệu; chúng là đầu vào tiêu chuẩn và đầu ra tiêu chuẩn tương ứng. Lỗi tiêu chuẩn là một lỗ mở ở bên cạnh của máy nơi nó có thể đẩy ra từ chối.

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

Sơ đồ trên cho thấy một băng chuyền đi qua hai máy. Dữ liệu đến từ bể chứa đầu vào bên trái, được đưa đến máy A, sau đó đầu ra được chuyển tiếp đến máy B (mà nó là đầu vào) và đầu ra của máy B được gửi vào thùng đầu ra ở bên phải.

Trong thuật ngữ unix, điều này được gọi là một đường ống dẫn . Ẩn dụ là hệ thống ống nước: một đường ống nối máy A với máy B. Cú pháp hệ vỏ cho đường ống ở trên là

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

Các < chuyển hướng biểu tượng kể vỏ để kết nối commandA's đầu vào tiêu chuẩn để các tập tin input-file.txttrước khi tung ra commandA. (Bạn có thể đặt chuyển hướng trước hoặc sau tên lệnh.) >Biểu tượng chuyển hướng báo cho trình bao kết nối commandBđầu ra tiêu chuẩn của output-file.txt. Biểu tượng ống (" |") ở giữa cho biết vỏ kết nối commandAđầu ra commandBtiêu chuẩn của đầu vào với đầu vào tiêu chuẩn trước khi khởi chạy chúng.

Các lệnh có thể có nhiều đầu vào và nhiều đầu ra, nhưng đó là nguyên liệu cho một ngày khác .


3
Hình ảnh đã giúp rất nhiều
JohnMerlino

Tương tự tốt đẹp. Tôi đã hiểu khái niệm về đường ống trong nhiều năm nay, nhưng bằng cách nào đó, không ai từng sử dụng phép tương tự nhà máy / băng tải, điều này làm cho nó thực sự dễ hiểu (và ngắn gọn). Cảm ơn bạn!
Owen Blacker

1
Tương tự lớn. Sẽ mượn cái này nếu bạn không phiền.
Tivie

Gilles, tôi đã hỏi một câu hỏi về cụm từ của bạn ở phía dưới: unix.stackexchange.com/q/96724/29146 . bạn có thể làm rõ?
strugee

@Gilles - Bạn có thể bao gồm một ví dụ minh họa tùy chọn để xác định chuyển hướng trước hoặc sau lệnh không? Ví dụ: đường ống có thể đọc là input-file.txt> lệnhA hoặc input-file.txt <lệnhA không?
động lực

6

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

Không phải là một lệnh, mà là một luồng. Tiêu chuẩn trong và ngoài giống như hộp thư. Khi một chương trình bắt đầu, nó được cung cấp một hộp để nhận và một hộp để gửi thư. Thông thường, đầu vào đến từ bàn phím và được đặt trong hộp, thư được đặt trong hộp ngoài kết thúc trên màn hình thiết bị đầu cuối của bạn.

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

Chương trình không thực sự biết điểm tiêu chuẩn. Khi bạn chuyển từ A đến B (như trong $ A | B), khi A đặt thư vào hộp thư bên ngoài, nó sẽ kết thúc trong hộp của B. B xử lý đầu vào và đặt thư của chính nó vào hộp bên ngoài, đó là những gì bạn thấy trên thiết bị đầu cuối.

Để bỏ siêu hình, như đã đề cập, tiêu chuẩn vào / ra là các luồng. Hộp thư, hoặc mô tả tệp , là một đầu của luồng. Để đường ống là kết nối tiêu chuẩn ra khỏi A với tiêu chuẩn trong B.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.