यह बताने पर कि क्या कोई फाइल डिस्क्रिप्टर किसी टर्मिनल डिवाइस की ओर इशारा करता है
एक प्रोग्राम बता सकता है कि क्या कोई फ़ाइल डिस्क्रिप्टर isatty()
मानक C फ़ंक्शन का उपयोग करके किसी ट्टी डिवाइस से जुड़ा है (जो आम तौर पर एक सहज-विशिष्ट tty- विशिष्ट ioctl()
सिस्टम कॉल करता है जो त्रुटि के साथ वापस आ जाएगा जब fd एक tty डिवाइस को इंगित नहीं करता है ।
[
/ test
उपयोगिता इसके साथ यह कर सकते हैं -t
ऑपरेटर।
if [ -t 1 ]; then
echo stdout is open to a terminal
fi
एक GNU / Linux सिस्टम पर ट्रेसिंग libc फ़ंक्शन कॉल:
$ ltrace [ -t 1 ] | cat
[...]
isatty(1) = 0
[...]
ट्रेसिंग सिस्टम कॉल:
$ strace [ -t 1 ] | cat
[...]
ioctl(1, TCGETS, 0x7fffd9fb3010) = -1 ENOTTY (Inappropriate ioctl for device)
[...]
यह बताने पर कि क्या यह पाइप की ओर इशारा करता है
यह निर्धारित करने के लिए कि एक fd पाइप / फेनो से जुड़ा हुआ है, कोई भी fstat()
सिस्टम कॉल का उपयोग कर सकता है , जो एक संरचना देता है जिसके st_mode
क्षेत्र में उस fd पर खोली गई फ़ाइल का प्रकार और अनुमतियाँ होती हैं। S_ISFIFO()
मानक सी मैक्रो उस पर इस्तेमाल किया जा सकता st_mode
है, तो एफडी एक पाइप है / फीफो निर्धारित करने के लिए क्षेत्र।
कोई मानक उपयोगिता नहीं है जो एक कर सकती है fstat()
, लेकिन एक stat
कमांड के कई असंगत कार्यान्वयन हैं जो यह कर सकते हैं। zsh
वह stat
बिलियन stat -sf "$fd" +mode
जिसके साथ मोड को एक स्ट्रिंग प्रतिनिधित्व के रूप में लौटाता है जिसका पहला चरित्र प्रकार ( p
पाइप के लिए) का प्रतिनिधित्व करता है । GNU के साथ stat
भी ऐसा ही किया जा सकता है stat -c %A - <&"$fd"
, लेकिन अकेले प्रकारstat -c %F - <&"$fd"
को भी रिपोर्ट करना होगा । बीएसडी के साथ : या ।stat
stat -f %St <&"$fd"
stat -f %HT <&"$fd"
यह बताने योग्य है कि क्या है
आवेदन आम तौर पर परवाह नहीं है अगर stdout एक पाइप है, हालांकि। वे परवाह कर सकते हैं कि यह खोजी है (हालांकि आमतौर पर यह तय नहीं करना है कि बफर करना है या नहीं)।
यह जांचने के लिए कि क्या एक fd खोजे जाने योग्य है (पाइप, सॉकेट्स, ट्टी डिवाइसेज़ को खोजने योग्य नहीं है, नियमित रूप से फाइल और अधिकांश ब्लॉक डिवाइस आमतौर पर हैं), कोई 0 के ऑफसेट के साथ एक रिश्तेदार lseek()
सिस्टम कॉल का प्रयास कर सकता है (इसलिए सहज)। dd
एक मानक उपयोगिता है जो एक इंटरफ़ेस है, lseek()
लेकिन इसका उपयोग उस परीक्षण के लिए नहीं किया जा सकता है, क्योंकि lseek()
यदि आप 0 से ऑफसेट के लिए पूछते हैं तो कार्यान्वयन बिल्कुल भी कॉल नहीं करेगा ।
zsh
और ksh93
गोले हालांकि ऑपरेटरों की मांग निर्मित है:
$ 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) एक छद्म टर्मिनल डिवाइस हो जाएगा।
जब स्टडआउट एक टर्मिनल डिवाइस पर होता है, तब भी आम तौर पर कुछ बफरिंग होती है, लेकिन यह लाइन आधारित होती है। printf
/ puts
और सह तब तक कुछ भी नहीं लिखेंगे जब तक कि कोई नया वर्ण आउटपुट नहीं होगा। अन्य प्रकार की फ़ाइलों के लिए, बफ़रिंग ब्लॉक (कुछ किलो बाइट्स) द्वारा होती है।
बफरिंग जो प्रश्नोत्तर यहाँ का एक संख्या में चर्चा कर रहे हैं निष्क्रिय करने के लिए कई विकल्प (के लिए खोज रहे हैं unbuffer या stdbuf , नहीं रीडायरेक्ट कटौती उत्पादन कर सकते हैं एक छद्म टर्मिनल के रूप में किया जा सकता है का उपयोग करके कुछ दृष्टिकोण देता है) या तो socat
/ script
/ expect
/ unbuffer
(एक expect
स्क्रिप्ट) / zsh
's zpty
या GNU या FreeBSD's द्वारा किए गए बफरिंग को निष्क्रिय करने के लिए निष्पादन योग्य में कोड इंजेक्ट करके stdbuf
।