ऐसे कोई "नियम" नहीं हैं। कुछ प्रोग्राम एसटीडीआईएन से इनपुट लेते हैं, और कुछ नहीं करते हैं। यदि कोई प्रोग्राम 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आदेशों।