Tôi chưa bao giờ thực sự nghĩ về cách shell thực sự thực hiện các lệnh đường ống. Tôi đã luôn được thông báo rằng "thiết bị xuất chuẩn của một chương trình được đưa vào hệ thống của một chương trình khác", như một cách nghĩ về các đường ống. Vì vậy, tự nhiên, tôi nghĩ rằng trong trường hợp nói, A | B, A sẽ chạy trước, sau đó B lấy thiết bị xuất chuẩn của A và sử dụng thiết bị xuất chuẩn của A làm đầu vào.
Nhưng tôi đã nhận thấy rằng khi mọi người tìm kiếm một quy trình cụ thể trong ps, họ sẽ bao gồm grep -v "grep" ở cuối lệnh để đảm bảo rằng grep không xuất hiện trong đầu ra cuối cùng. Điều này có nghĩa là trong lệnh ps aux | grep "bash" | grep -v "grep", có nghĩa là ps biết rằng grep đang chạy và do đó nằm trong đầu ra của ps. Nhưng nếu ps kết thúc chạy trước khi đầu ra của nó được chuyển sang grep, làm sao nó biết rằng grep đang chạy?
flamingtoast@FTOAST-UBUNTU: ~$ ps | grep ".*"
PID TTY TIME CMD
3773 pts/0 00:00:00 bash
3784 pts/0 00:00:00 ps
3785 pts/0 00:00:00 grep