ไม่มี "กฎ" เช่นนี้ บางโปรแกรมรับอินพุตจาก STDIN และบางโปรแกรมไม่ทำ หากโปรแกรมสามารถรับอินพุตจาก STDIN ก็สามารถไปป์ไลน์ได้หากไม่สามารถทำได้
ปกติคุณสามารถบอกได้ว่าโปรแกรมจะรับอินพุตหรือไม่โดยคิดว่ามันทำอะไร หากงานของโปรแกรมคือการอย่างใดจัดการเนื้อหาของไฟล์ (เช่นgrep
, sed
, awk
ฯลฯ ) มันปกติจะใช้เวลาการป้อนข้อมูลจาก STDIN หากงานของมันคือการจัดการกับไฟล์ตัวเอง (เช่นmv
, rm
, cp
) หรือกระบวนการ (เช่นkill
, lsof
) หรือข้อมูลเกี่ยวกับสิ่งที่กลับมา (เช่นtop
, find
, ps
) แล้วมันไม่ได้
วิธีคิดอีกอย่างคือความแตกต่างระหว่างการโต้แย้งและอินพุต ตัวอย่างเช่น:
mv foo bar
ในคำสั่งด้านบนmv
ไม่มีอินพุตเช่นนี้ สิ่งที่ได้รับคือสองข้อโต้แย้ง ไม่ทราบหรือไม่สนใจสิ่งที่อยู่ในไฟล์ใดไฟล์หนึ่งเพียงแค่รู้ว่าสิ่งเหล่านั้นเป็นข้อโต้แย้งและควรจัดการไฟล์เหล่านั้น
ในทางกลับกัน
sed -e 's/foo/bar/' < file
--- -- ------------ ----
| | | |-> input
| | |------------> argument
| |--------------------> option/flag/switch
|------------------------> command
ที่นี่sed
ได้รับการป้อนข้อมูลเช่นเดียวกับการโต้แย้ง เนื่องจากใช้อินพุตจึงสามารถอ่านได้จาก STDIN และสามารถส่งไปยัง
จะได้รับความซับซ้อนมากขึ้นเมื่อมีการโต้แย้งสามารถจะป้อนข้อมูล ตัวอย่างเช่น
cat file
นี่คืออาร์กิวเมนต์ที่ได้รับไปfile
cat
เพื่อความแม่นยำชื่อ ไฟล์file
คืออาร์กิวเมนต์ อย่างไรก็ตามเนื่องจากcat
เป็นโปรแกรมที่ปรุงแต่งเนื้อหาของไฟล์, file
การป้อนข้อมูลของมันคือสิ่งที่อยู่ภายใน
สิ่งนี้สามารถถูกแสดงโดยใช้strace
โปรแกรมที่ติดตามการเรียกของระบบโดยกระบวนการ หากเราทำงานcat foo
ผ่านstrace
เราจะเห็นว่าไฟล์foo
เปิดอยู่:
$ strace cat foo 2| grep foo
execve("/bin/cat", ["cat", "foo"], [/* 44 vars */]) = 0
open("foo", O_RDONLY)
บรรทัดแรกข้างต้นแสดงให้เห็นว่าโปรแกรม/bin/cat
นั้นถูกเรียกใช้และข้อโต้แย้งของมันคือcat
และfoo
(อาร์กิวเมนต์แรกเป็นตัวโปรแกรมเสมอ) หลังจากนั้นอาร์กิวเมนต์foo
ถูกเปิดในโหมดอ่านอย่างเดียว ตอนนี้เปรียบเทียบกับ
$ strace ls foo 2| grep foo
execve("/bin/ls", ["ls", "foo"], [/* 44 vars */]) = 0
stat("foo", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
lstat("foo", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
write(1, "foo\n", 4foo
ที่นี่ยังls
เอาตัวเองและfoo
เป็นข้อโต้แย้ง อย่างไรก็ตามไม่มีการopen
เรียกอาร์กิวเมนต์จะไม่ถือว่าเป็นอินพุต แต่ls
เรียกระบบstat
ห้องสมุด (ซึ่งไม่ได้เป็นสิ่งเดียวกับstat
คำสั่ง) foo
ที่จะได้รับข้อมูลเกี่ยวกับไฟล์
โดยสรุปหากคำสั่งที่คุณใช้อยู่จะอ่านอินพุตคุณสามารถไพพ์ไปที่คำสั่งนั้นถ้าไม่คุณไม่สามารถทำได้
pgrep
,pkill
และkillall
คำสั่ง