কোনও ফাইল বর্ণনাকারী একটি টার্মিনাল ডিভাইসে নির্দেশ করে কিনা তা বলছে
কোনও প্রোগ্রাম জানাতে পারে যে কোনও ফাইল বর্ণনাকারী টিটি ডিভাইসের সাথে isatty()স্ট্যান্ডার্ড সি ফাংশন ব্যবহার করে জড়িত রয়েছে (যা সাধারণত নীচে একটি নির্দোষ টিটি-নির্দিষ্ট ioctl()সিস্টেম কল করে থাকে যখন এফডি টিটিটি ডিভাইসের দিকে ইঙ্গিত না করে ত্রুটি দিয়ে ফিরে আসবে) ।
[/ testউপযোগ তার সঙ্গে এটা করতে পারেন -tঅপারেটর।
if [ -t 1 ]; then
echo stdout is open to a terminal
fi
জিএনইউ / লিনাক্স সিস্টেমে libc ফাংশন কলগুলি সন্ধান করা:
$ ltrace [ -t 1 ] | cat
[...]
isatty(1) = 0
[...]
ট্র্যাকিং সিস্টেম কল:
$ strace [ -t 1 ] | cat
[...]
ioctl(1, TCGETS, 0x7fffd9fb3010) = -1 ENOTTY (Inappropriate ioctl for device)
[...]
এটি একটি পাইপের দিকে নির্দেশ করে কিনা তা বলছে
কোনও এফডি পাইপ / ফিফোর সাথে যুক্ত কিনা তা নির্ধারণ করার জন্য, কেউ fstat()সিস্টেম কলটি ব্যবহার করতে পারে , যা st_modeএমন একটি কাঠামো ফিরিয়ে দেয় যার ক্ষেত্রটি সেই এফডিতে খোলার ফাইলের ধরণ এবং অনুমতি রয়েছে। S_ISFIFO()প্রমিত C ম্যাক্রো যে ব্যবহার করা যেতে পারে st_modeযদি FD একটি নল হয় / FIFO নির্ধারণ ক্ষেত্র।
এটি করতে পারে এমন কোনও স্ট্যান্ডার্ড ইউটিলিটি নেই fstat()তবে statকমান্ডের বেশ কয়েকটি বেমানান বাস্তবায়ন রয়েছে যা এটি করতে পারে। zshএর statঅন্তর্নির্মিত stat -sf "$fd" +modeযার সাহায্যে মোডটি স্ট্রিং প্রতিনিধিত্ব হিসাবে ফেরত দেয় যার প্রথম অক্ষরটি টাইপের ( pপাইপের জন্য) প্রতিনিধিত্ব করে । জিএনইউ এটির statসাহায্যে একই কাজ করতে পারে stat -c %A - <&"$fd"তবে কেবল stat -c %F - <&"$fd"এই ধরণের প্রতিবেদন করতে হবে। বিএসডি সহ stat: stat -f %St <&"$fd"বা stat -f %HT <&"$fd"।
এটি সন্ধানযোগ্য কিনা তা বলছি
স্টাডাউট যদিও পাইপ হয় তবে অ্যাপ্লিকেশনগুলি সাধারণত যত্ন করে না। তারা যত্নশীল হতে পারে যে এটি সন্ধানযোগ্য (যদিও সাধারণত বাফার করবেন কিনা তা সিদ্ধান্ত নিতে হবে না)।
কোনও এফডি সন্ধানযোগ্য কিনা তা পরীক্ষা করতে (পাইপ, সকেট, টিটি ডিভাইসগুলি সন্ধানযোগ্য নয়, নিয়মিত ফাইল এবং বেশিরভাগ ব্লক ডিভাইসগুলি সাধারণত হয়), 0 টি অফসেটের সাথে একটি আপেক্ষিক lseek()সিস্টেম কল চেষ্টা করতে পারে (তাই নির্দোষ)। ddএটি একটি স্ট্যান্ডার্ড ইউটিলিটি যা একটি ইন্টারফেস lseek()তবে এটি পরীক্ষার জন্য ব্যবহার করা যায় না, কারণ lseek()আপনি যদি 0 এর অফসেট চেয়ে থাকেন তবে বাস্তবায়নগুলি মোটেই কল করবে না ।
zshএবং ksh93শাঁস যদিও অপারেটার সচেষ্ট builtin আছে:
$ strace -e lseek ksh -c ': 1>#((CUR))' | cat
lseek(1, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
ksh: 1: not seekable
$ strace -e lseek zsh -c 'zmodload zsh/system; sysseek -w current -u 1 0 || syserror'
lseek(1, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
Illegal seek
বাফারিং অক্ষম করা হচ্ছে
scriptকমান্ড একটি প্রোগ্রাম আউটপুট ক্যাপচার করার জন্য সিউডো-টার্মিনাল যুগল ব্যবহার করে, তাই প্রোগ্রামের stdout- এ (এবং stdin এবং দ্বারা stderr) একটি সিউডো-টার্মিনাল ডিভাইস হতে হবে।
Stdout যখন একটি টার্মিনাল ডিভাইসে হয়, তখনও সাধারণত কিছুটা বাফারিং থাকে তবে এটি লাইন ভিত্তিক। printf/ putsএবং কো কোনও নতুন লেখার অক্ষর আউটপুট না হওয়া পর্যন্ত কিছু লিখবে না। অন্যান্য ধরণের ফাইলের জন্য, বাফারিংগুলি ব্লকগুলি (কয়েক কিলো বাইটের) দ্বারা হয়।
বাফারিং নিষ্ক্রিয় করার জন্য বিভিন্ন বিকল্প রয়েছে যা এখানে বেশ কয়েকটি প্রশ্নোত্তরে আলোচনা করা হয়েছে (যেমন আনবুফার বা এসডিবিউফ অনুসন্ধান করুন , কাট আউটপুট পুনর্নির্দেশ করা যায় না ) সিউডো-টার্মিনাল ব্যবহার করে socat/ script/ expect/ দ্বারা করা যেতে পারে unbuffer(একটি expectস্ক্রিপ্ট) / zshএর zptyবা জিএনইউ বা ফ্রিবিএসডি এর দ্বারা বাফারিং অক্ষম করতে এক্সিকিউটেবল কোড ইনজেকশন দিয়ে stdbuf।