Sau đây được đơn giản hóa một chút để giúp người dùng mới.
Chà, trước tiên, cần phải hiểu khái niệm đầu vào tiêu chuẩn và đầu ra tiêu chuẩn.
Trong Linux và các hệ điều hành tương tự UNIX khác, mỗi quy trình có một đầu vào tiêu chuẩn ( stdin
) và đầu ra tiêu chuẩn ( stdout
). Tình huống thông thường là stdin
bàn phím của bạn và stdout
là cửa sổ màn hình hoặc thiết bị đầu cuối của bạn.
Vì vậy, khi bạn chạy ls
, nó sẽ ném đầu ra của nó stdout
. Nếu bạn không làm gì khác, nó sẽ đi đến màn hình hoặc cửa sổ đầu cuối của bạn và bạn sẽ xem nó.
Bây giờ, một số lệnh Linux tương tác với người dùng và sử dụng stdin
để làm điều đó, trình soạn thảo văn bản của bạn là một trong số đó. Nó đọc từ stdin
để chấp nhận tổ hợp phím của bạn, làm mọi thứ và sau đó viết nội dung stdout
.
Tuy nhiên, cũng có những lệnh không tương tác hoặc "bộ lọc" KHÔNG hoạt động tương tác mà muốn có một loạt dữ liệu. Các lệnh này sẽ lấy mọi thứ stdin
có, làm một cái gì đó cho nó, và sau đó ném nó vàostdout
Chúng ta hãy xem một lệnh khác được gọi là du
- viết tắt của việc sử dụng đĩa. du /usr
, ví dụ, sẽ in ra (để stdout
giống như bất kỳ lệnh Linux nào khác) một danh sách mọi tệp trong thư mục đó và kích thước của nó:
# du /usr
2312 /usr/games
124 /usr/lib/tc
692 /usr/lib/rygel-1.0
400 /usr/lib/apt/methods
40 /usr/lib/apt/solvers
444 /usr/lib/apt
6772 /usr/lib/gnash
Như bạn có thể nói ngay ra con dơi, nó không được sắp xếp và bạn có thể muốn nó được sắp xếp theo thứ tự kích thước.
sort
là một trong những lệnh "bộ lọc" sẽ lấy một loạt các thứ từ đó stdin
và sắp xếp nó.
Vì vậy, nếu chúng ta làm điều này:
# du /usr | sort -nr
chúng tôi nhận được điều này, tốt hơn một chút:
4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668 /usr/lib/vmware
501700 /usr/share/locale
366476 /usr/lib/x86_64-linux-gnu
318660 /usr/lib/libreoffice
295388 /usr/lib/vmware/modules
290376 /usr/lib/vmware/modules/binary
279056 /usr/lib/libreoffice/program
216980 /usr/share/icons
Và bây giờ bạn có thể thấy rằng "đường ống" kết nối stdout
một lệnh này với lệnh stdin
khác. Thông thường, bạn sẽ sử dụng nó trong các tình huống như thế này nơi bạn muốn lọc, sắp xếp hoặc thao tác đầu ra của lệnh. Chúng có thể được xếp tầng nếu bạn muốn xử lý đầu ra thông qua nhiều lệnh loại bộ lọc.
Nếu bạn gõ một sort
mình, nó vẫn sẽ cố đọc từ đó stdin
. Vì stdin
được kết nối với bàn phím của bạn, nó sẽ chờ bạn nhập và xử lý mọi thứ cho đến khi bạn nhấn Control-D. Nó sẽ không nhắc bạn vì nó không thực sự được sử dụng tương tác.
Một chương trình có thể cho biết liệu stdin
có tương tác hay không, vì vậy một số chương trình có thể hoạt động khác đi nếu bạn tự phát hành chúng hoặc ở cuối đường ống.
Ngoài ra, đường ống một chương trình chỉ hoạt động tương tác, như vi
, sẽ dẫn đến bạn có một thời gian tồi tệ.
Các đường ống khác với chuyển hướng ở chỗ dữ liệu được xáo trộn từ lệnh này sang lệnh khác mà không được lưu trữ ở bất cứ đâu. Vì vậy, trong ví dụ trên, du
đầu ra của không được lưu trữ ở bất cứ đâu. Phần lớn thời gian bạn không muốn điều này với các đường ống vì lý do sử dụng đường ống là để xử lý đầu ra của một lệnh theo một cách nào đó - nhưng, có một lệnh tee
cho phép bạn có bánh của bạn và cũng ăn nó, nó sẽ sao chép những gì nó nhận được từ stdin
cả hai stdout
và một tập tin bạn chọn. Bạn cũng có thể làm điều này bash
với một số cú pháp phức tạp liên quan đến ký hiệu và dấu ngoặc mà tôi không biết.
|
là nó không sử dụng tên, đầu ra từ lệnh l-hand được truyền trực tiếp đến đầu vào cho lệnh ở phía r-hand của ống.