(সম্পূর্ণতার জন্য)
যদিও @ enzotib এর উত্তর সম্ভবত আপনি যা চান তা হয়, এটা আপনার জন্য কি জিজ্ঞাসা না। [ -t 1 ]
ফাইল বিবরণকারীটি একটি টার্মিনাল ডিভাইস কিনা তা পরীক্ষা করে, এটি কোনও পাইপ ব্যতীত অন্য কিছু নয় (নিয়মিত ফাইল, সকেট, অন্য ধরণের ডিভাইসের মতো /dev/null
...)
[
কমান্ডের কি কোন সমতুল আছে -t
কিন্তু পাইপ জন্য। কোনও ফাইল বর্ণনাকারীর সাথে যুক্ত ফাইলের ধরণটি পেতে, আপনাকে fstat()
এটিতে সিস্টেম কল করতে হবে। এটি করার জন্য কোনও মানক কমান্ড নেই, তবে কিছু সিস্টেম বা শেলগুলির কিছু রয়েছে।
জিএনইউ সহ 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
তার স্টাডাউট একটি পাইপ যেতে চালানো ।
যদি আপনার শেলটি থাকে তবে ksh93
মনে রাখবেন যে কয়েকটি সিস্টেমে এটি তার পাইপলাইনে পাইপের পরিবর্তে সকেটপেইস ব্যবহার করে।
[[ -t 0 && -t 1 ]]
আপনি শুধুমাত্র লাইন সংখ্যা চান তাহলে উভয় মান ইনপুট এবং মান আউটপুট টার্মিনাল সাথে সংযুক্ত।