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