ไม่มี "กฎ" เช่นนี้ บางโปรแกรมรับอินพุตจาก 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คำสั่ง