Trên hầu hết các hệ thống, bạn có thể chuyển hướng đầu vào/đầu ra/lỗi chuẩn tới các bộ mô tả hoặc vị trí tệp khác.
Ví dụ (trên Unix):
./appname > output
Chuyển hướng stdout từ appname vào một tập tin tên là đầu ra.
./appname 2> errors > output
Chuyển hướng stdout
đến một file có tên đầu ra, và tất cả các lỗi từ stderr
vào một tập tin tên là lỗi.
Trên các hệ thống unix bạn cũng có thể có một chương trình mở một bộ mô tả tập tin và trỏ nó tại stdin
, như thế này:
echo "input" > input
cat input | ./appname
này sẽ làm cho chương trình để đọc từ ống cho stdin
.
Đây là cách bạn kết hợp các tiện ích khác nhau với nhau để tạo một công cụ lớn hơn.
find . -type f | ./appname | grep -iv "search"
này sẽ chạy lệnh find
, và đưa đầu ra và ống nó nó vào ./appname, sau đó appname
's đầu ra sẽ được gửi đến grep
' s đầu vào mà sau đó tìm kiếm từ 'tìm kiếm', hiển thị chỉ là kết quả phù hợp.
Nó cho phép nhiều tiện ích nhỏ có hiệu ứng rất mạnh.
suy nghĩ của >
, <
, và |
như hệ thống ống nước.
>
giống như cống trong bồn rửa, nó chấp nhận dữ liệu và lưu trữ dữ liệu nơi bạn muốn đặt. Khi một vỏ gặp >
nó sẽ mở một tập tin.
> file
Khi vỏ nhìn thấy ở trên, nó sẽ open
tệp bằng cách sử dụng cuộc gọi hệ thống chuẩn và ghi nhớ bộ mô tả tệp đó. Trong trường hợp trên vì không có đầu vào, nó sẽ tạo một tệp rỗng và cho phép bạn nhập nhiều lệnh hơn.
banner Hello
Lệnh này viết chữ thật to lên bảng điều khiển và sẽ khiến thư di chuyển (tôi đang sử dụng Unix ở đây vì đó là những gì tôi biết rõ nhất). Đầu ra được viết đơn giản theo tiêu chuẩn. Sử dụng một "chìm" (>
) chúng ta có thể kiểm soát nơi đầu ra đi, vì vậy
banner Hello > bannerout
sẽ khiến tất cả các dữ liệu từ đầu ra tiêu chuẩn biểu ngữ để được chuyển hướng đến các mô tả tập tin vỏ đã mở ra và do đó được ghi vào một tệp có tên là bannerout
.
Đường ống hoạt động tương tự như >
trong đó chúng giúp kiểm soát lưu lượng của dữ liệu. Tuy nhiên, các đường ống không thể ghi vào tệp và chỉ có thể được sử dụng để giúp luồng dữ liệu chuyển từ điểm này sang điểm khác.
Ví dụ, đây là nước chảy qua nhiều trạm biến áp và làm sạch chất thải:
pump --from lake | treatment --cleanse-water | pump | reservoir | pump > glass
Nước chảy từ hồ, thông qua một đường ống cho nhà máy xử lý nước, từ nhà máy trở lại vào một máy bơm mà di chuyển nó vào một hồ chứa, sau đó nó được bơm một lần nữa vào các đường ống nước thành phố và thông qua bồn rửa của bạn vào thủy tinh của bạn.
Lưu ý rằng các ống chỉ đơn giản là kết nối tất cả các đầu ra với nhau, cuối cùng nó kết thúc trong kính của bạn.
Cũng tương tự như vậy với các lệnh và xử lý chúng trong một trình bao trên Linux. Nó cũng đi theo một con đường để có được kết quả cuối cùng.
Bây giờ có một điều cuối cùng mà tôi chưa thảo luận trong các tuyên bố trước đó của tôi, đó là ký tự đầu vào <
. Những gì nó làm là đọc từ một tập tin và đầu ra nó để stdin trên các chương trình.
cat < bannerout
Sẽ chỉ in những gì được lưu trữ trong biểu ngữ. Điều này có thể được sử dụng nếu bạn có một tệp bạn muốn xử lý nhưng không muốn thêm trước cat <file>
vì không muốn chạy thêm lệnh trong chuỗi.
Vì vậy, cố gắng này:
echo "Hello" > bannerinput
banner < bannerinput
này đầu tiên sẽ đặt chuỗi "Hello" trong tập tin bannerinput
, và sau đó khi biểu ngữ chạy của bạn nó sẽ đọc từ tập tin bannerinput
.
Tôi hy vọng điều này sẽ giúp bạn hiểu cách chuyển hướng và pipping hoạt động trên Unix (một số nếu không nhất cũng sẽ áp dụng cho Windows).
Trên dòng lệnh, tôi có thể gõ một cái gì đó như 'program.exe> output.txt' và mọi thứ trên' stdout' sẽ được ghi vào 'output.txt' thay vì bàn điều khiển. Các script CGI cũng hoạt động theo cách này; chương trình viết ra HTML trên 'stdout' và máy chủ web cung cấp đầu ra xuống kết nối HTTP. –
Ngoài ra, 'inetd' sẽ kết nối' stdin' và 'stdout' vào ổ cắm. –