कैसे `बिल्ली <> फ़ाइल` काम करता है?


42

cat < fileफ़ाइल की सामग्री को प्रिंट करने के लिए प्रिंट करता है ।

cat > fileस्टड को तब तक पढ़ता है जब तक Ctrl+ Dका पता नहीं लग जाता है और इनपुट टेक्स्ट फाइल में लिखा जाता है

cat <> file, कम से कम बाश के मेरे संस्करण में, फ़ाइल की सामग्री को खुशी से (त्रुटि के बिना) प्रिंट करता है, लेकिन फ़ाइल को संशोधित नहीं करता है और न ही यह संशोधन टाइमस्टैम्प को अपडेट करता है।

बश मानक >तीसरे कथन में दिखावटी उपेक्षा को कैसे उचित ठहराता है - और, अधिक महत्वपूर्ण बात यह है कि यह कुछ भी कर रहा है?

जवाबों:


47

बैश एक पठन-पाठन फ़ाइल विवरणक<> बनाने के लिए उपयोग करता है :

पुनर्निर्देशन ऑपरेटर

[n]<>word

फ़ाइल का नाम जिसका नाम फ़ाइल डिस्क्रिप्टर n पर पढ़ने और लिखने दोनों के लिए खोला जाना है, या n निर्दिष्ट नहीं होने पर फ़ाइल डिस्क्रिप्टर 0 पर खोला जा सकता है। यदि फ़ाइल मौजूद नहीं है, तो यह बनाई गई है।

cat <> filefileरीड-राइट खोलता है और इसे डिस्क्रिप्टर 0 (मानक इनपुट) से बांधता है। यह अनिवार्य रूप से < fileकिसी भी समझदारी से लिखे गए प्रोग्राम के लिए समान है , क्योंकि किसी को भी मानक इनपुट को लिखने की कोशिश करने की संभावना नहीं है, लेकिन अगर कोई ऐसा करने में सक्षम होता है।

- आप एक साधारण सी कार्यक्रम सीधे कि बाहर का परीक्षण करने के लिख सकते हैं write(0, "hello", 6)लिखेंगे helloमें fileमानक इनपुट के माध्यम से।

<>समान प्रभाव वाले किसी अन्य POSIX- अनुरूप शेल में भी काम करना चाहिए ।


1
लेखन ... स्टडिन के लिए? ... क्या इसके लिए कोई वैध उपयोग मामला है?
Qix

3
ऑफ-हैंड, मैं किसी अच्छे के बारे में नहीं सोच सकता। एक स्पष्ट विवरणक ( 4<>file) देना उपयोगी है, और मुझे लगता है कि जब भी आप इसे छोड़ते हैं, तो 0 डिफ़ॉल्ट रूप से अच्छा होता है। स्टडआउट से पढ़ना कोई बेहतर नहीं है।
माइकल होमर

5
<>कुछ सिस्टम पर भी उपयोगी है (लिनक्स की तरह) नामांकित पाइप को बिना अवरुद्ध किए खोलने के लिए जब तक कि कोई अन्य प्रक्रिया इसे लिखने के लिए नहीं खोलती।
स्टीफन चेज़लस

1
@Qix: अच्छी तरह से लिखें (0, "पासवर्ड:", 10) एक पासवर्ड के लिए संकेत करने का एक अच्छा तरीका है यदि आप किसी भी तरह के ट्टी की तरह संकेत देना चाहते हैं। मैं इसे केवल stderr पर देखने के लिए उपयोग किया जाता है, लेकिन विशेष रूप से एक ही तकनीक stdin पर काम नहीं करता है।
जोशुआ

3
@Qix - POSIX Rationale से - <>ऑपरेटर एक एप्लिकेशन लिखने में उपयोगी हो सकता है जो कई टर्मिनलों के साथ काम करता है, और कभी-कभी एक शेल शुरू करना चाहता था। यह शेल बदले में उन अनुप्रयोगों को चलाने में असमर्थ होगा जो एक साधारण नियंत्रण टर्मिनल से चलते हैं, जब तक कि वह इसका उपयोग नहीं कर सकता <>... जैसे कि ... पेजर more, जो मानक कमांड से अपने कमांड प्राप्त करने के लिए पढ़ता है, इसलिए मानक इनपुट और मानक आउटपुट दोनों अपने सामान्य उपयोग के लिए उपलब्ध हैं। cat food | more - >/dev/tty03 2<>/dev/tty03
मोकेसर

38

<> fileफ़ाइल को खोलता है (डिफॉल्ट रूप से डिस्क्रिप्टर 0 (स्टडिन पर), जैसे कि <) ट्रंकेशन के बिना रीड + राइट मोड में और फ़ाइल का निर्माण करना अगर यह पहले से मौजूद नहीं था

यह सिस्टम कॉल को दिए गए O_RDWR|O_CREATझंडे से मेल खाती है open()। इसके विपरीत <है O_RDONLYऔर >है O_WRONLY|O_CREAT|O_TRUNCऔर >> O_WRONLY|O_CREAT|O_APPEND

स्टड योग्य होने के नाते अक्सर उपयोगी नहीं होता है क्योंकि आमतौर पर आवेदन उनके स्टड को नहीं लिखते हैं। एप्लिकेशन आमतौर पर वे स्टार्टअप पर प्राप्त फ़ाइल विवरणक पर पढ़ने और लिखने की उम्मीद नहीं करते हैं ; वे आम तौर पर स्टडिन (या एक फाइल डिस्क्रिप्टर जिसे वे स्वयं खोलते हैं) से पढ़ते हैं और स्टैडआउट या स्टेडर (या एक फाइल डिस्क्रिप्टर जिसे वे स्वयं खोलते हैं) को लिखते हैं।

<> इसके उपयोग हो सकते हैं:

  • आप पसंद कर सकते हैं cat <> fileअधिक cat < fileअगर तुम अगर आदेश असफल नहीं करना चाहती fileमौजूद नहीं है, लेकिन एक खाली fileबजाय बनाया।
  • गैर-ट्रंचिंग पहलू <>इसे फाइलों को अधिलेखित करने के लिए उपयोगी बनाता है। उस स्थिति में, आप आमतौर पर इसका उपयोग फाइल डिस्क्रिप्टर 0 पर नहीं करते हैं:

    printf xxx 1<> file

    के fileसाथ पहले 3 बाइट्स बदलता है xxx

  • लिनक्स जैसी कुछ प्रणालियों <>पर , एक नामित पाइप (FIFO) पर नामित पाइप को अवरुद्ध किए बिना (दूसरे छोर को खोलने के लिए किसी अन्य प्रक्रिया की प्रतीक्षा किए बिना) को खोलता है, और यह सुनिश्चित करता है कि पाइप संरचना जीवित है। उदाहरण के लिए:

    mkfifo pipe; sed 's/foo/bar/g' <> pipe

    sedकिसी भी अन्य प्रक्रियाओं से आने वाले डेटा को लिखता है और कभी नहीं देखता है eof


1
ध्यान दें कि एटी एंड टी ksh93 पर, ( स्टडआउट ) के बजाय <>डिफॉल्ट 1<>( स्टडआउट 0<>)। यह एक POSIX अनुपालन बग है जिसे मैंने रिपोर्ट किया था और अगले रिलीज में तय किया जाएगा। github.com/att/ast/issues/75 लेकिन जब तक वर्तमान ksh93 संस्करण उपयोग से बाहर नहीं हो जाते, तब तक आपको फ़ाइल डिस्क्रिप्टर नंबर को पोर्टेबली उपयोग करने के लिए शामिल करना <>होगा।
मार्टिज़न डेकर

@MartijnDekker, मुझे पता है, मैं पहले स्थान पर इसके बारे में बता रहा था; ;-) ध्यान दें कि यह केवल ksh93t + (जहां व्यवहार बदल गया है) और इसके बाद के संस्करण के लिए है।
स्टीफन चेज़लस

लिनक्स के विपरीत सिस्टम क्या हैं (या थे) जहां mkfifo fifo; exec 3<>fifoब्लॉक होगा?
चाचा बिली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.