(संपूर्णता के लिए)
जबकि @ enzotib का जवाब शायद सबसे ज्यादा वही है जो आप चाहते हैं, यह वह नहीं है जो आपने मांगा था। [ -t 1 ]
जाँचता है कि फ़ाइल डिस्क्रिप्टर एक टर्मिनल डिवाइस है, न कि यह पाइप के अलावा और कुछ भी नहीं है (जैसे एक नियमित फ़ाइल, सॉकेट, डिवाइस का एक अन्य प्रकार /dev/null
...)
[
आदेश का कोई बराबर है -t
लेकिन पाइप के लिए। फाइल डिस्क्रिप्टर से जुड़ी फाइल का प्रकार प्राप्त करने के लिए, आपको उस पर fstat()
सिस्टम कॉल करने की आवश्यकता है। ऐसा करने के लिए कोई मानक कमांड नहीं है, लेकिन कुछ सिस्टम या शेल में कुछ हैं।
GNU के साथ stat
:
grep() {
if { [ "$(LC_ALL=C stat -c %F - <&3)" = fifo ]; } 3>&1 ||
[ "$(LC_ALL=C stat -c %F -)" = fifo ]; then
command grep "$@"
else
command grep -n "$@"
fi
}
या zsh
अपने स्वयं के stat
बिलिन के साथ (जो कुछ वर्षों में जीएनयू की एक भविष्यवाणी करता है), यहां zstat
केवल लोड किया गया है :
grep() {
zmodload -F zsh/stat b:zstat
local stdin_type stdout_type
if zstat -A stdin_type -s -f 0 +mode &&
zstat -A stdout_type -s -f 1 +mode &&
[[ $stdin_type = p* || $stdout_type = p* ]]
then
command grep "$@"
else
command grep -n "$@"
fi
}
अब कुछ नोट:
यह न केवल शेल पाइपलाइन हैं जो पाइप का उपयोग करते हैं।
var=$(grep foo bar)
या:
cmd <(grep foo bar)
या:
coproc grep foo bar
भी चलाने के grep
अपने stdout एक पाइप को मिल गया।
यदि आपका शेल है ksh93
, तो ध्यान दें कि कुछ सिस्टम पर, यह अपनी पाइपलाइनों में पाइप के बजाय सॉकेटपेयर का उपयोग करता है।
[[ -t 0 && -t 1 ]]
यदि आप केवल लाइन नंबर चाहते हैं यदि मानक इनपुट और मानक आउटपुट दोनों एक टर्मिनल से जुड़े हैं।