फ़ाइल विवरणक बंद करना,> और - बनाम <और -


49

मैं जिस बैश ट्यूटोरियल को पढ़ रहा हूं, उसमें लिखा है कि यदि आप पढ़ने के लिए फाइल डिस्क्रिप्टर खोलते हैं, यानी

exec 3< echolist

तो आपको इसे इस तरह से बंद करना होगा,

exec 3<&-

हालाँकि, यदि आप लिखने के लिए फ़ाइल डिस्क्रिप्टर खोलते हैं, तो उसे इस तरह बंद करना होगा:

exec 3>&-

फिर भी जब मैं इंटरनेट पर देखता हूं, तो मैं देखता हूं कि लोग फाइलें खोल रहे हैं और फिर उन्हें इसके साथ बंद कर रहे हैं:

exec 3>&- 

नोट: जब, ट्यूटोरियल के अनुसार, उनका उपयोग किया जाना चाहिए exec 3<&1

तो मेरा सवाल यह exec n>&-है कि क्या फाइल डिस्क्रिप्टर नंबर n के माध्यम से सभी फाइल डिस्क्रिप्टर को बंद किया जा सकता है? भले ही इसे पढ़ने, लिखने या दोनों के लिए खोला गया हो?


21
निर्दिष्ट नहीं होने पर ( और जबकि है ) के बीच एकमात्र अंतर >&-और <&-डिफ़ॉल्ट fd है । उसी के लिए जो उपलब्ध नहीं होने के अलावा समान है। >&-1>&-<&-0<&-x>&yx<&yx
स्टीफन चेज़लस

जवाबों:


48

आप दोनों का उपयोग कर फ़ाइल वर्णनकर्ता बंद कर सकते हैं <&-और >&-, bashएक ही रूप में दो वाक्य रचना पार्स होगा।

स्रोत कोड में फ़ाइल y.tab.c से bash:

5385   /* Hack <&- (close stdin) case.  Also <&N- (dup and close). */                
5386   if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
5387     return (character);

2
इसका उपयोग <>फ़ाइल डिस्क्रिप्टर पर भी किया जा सकता है।
CMCDragonkai

1
नहीं, यह संभव नहीं है, लेकिन वर्णनकर्ता को बंद करने के लिए 3>&-या जैसा 3<&-प्रतीत होता है।
CMCDragonkai

1
उस समापन <>को उन्हीं तरीकों से किया जा सकता है।
CMCDragonkai

1
मुझे आपका मतलब नहीं मिल रहा है। कृपया एक उदाहरण दें
।/

1
मुझे नहीं लगता कि मेरा यही मतलब है। बस यह है कि आ पढ़ लिख फ़ाइल डिस्क्रिप्टर को 3> और - और 3 <& - का उपयोग करके बंद किया जा सकता है।
CMCDragonkai

15

जहां तक ​​मैं देख सकता हूं, exec 3>&-और exec 3<&-समान हैं और किसी भी फाइल डिस्क्रिप्टर पर इस्तेमाल किया जा सकता है, भले ही यह कैसे खोला गया हो। शेल कमांड लैंग्वेज की पोसिक्स परिभाषा की धारा 2.7.6 और 2.7.5 के अनुसार :

2.7.5 एक इनपुट फ़ाइल डिस्क्रिप्टर को डुप्लिकेट करना

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

[N] <और शब्द

[... कटाव ...]

यदि शब्द '-' का मूल्यांकन करता है, तो फ़ाइल डिस्क्रिप्टर n या मानक इनपुट यदि n निर्दिष्ट नहीं है, तो बंद कर दिया जाएगा। फ़ाइल डिस्क्रिप्टर को खोलने का प्रयास जो खुला नहीं है, उसमें त्रुटि नहीं होगी। यदि शब्द किसी और चीज़ का मूल्यांकन करता है, तो व्यवहार अनिर्दिष्ट है।

2.7.6 डुप्लिकेटिंग आउटपुट फ़ाइल डिस्क्रिप्टर

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

[N]> और शब्द

[... कटाव ...]

यदि शब्द '-' का मूल्यांकन करता है, तो फ़ाइल डिस्क्रिप्टर n या मानक आउटपुट यदि n निर्दिष्ट नहीं है, तो बंद है। फ़ाइल डिस्क्रिप्टर को खोलने का प्रयास जो खुला नहीं है, उसमें त्रुटि नहीं होगी। यदि शब्द किसी और चीज़ का मूल्यांकन करता है, तो व्यवहार अनिर्दिष्ट है।

ध्यान दें कि मूल रूप से फ़ाइल डिस्क्रिप्टर n को कैसे खोला गया था, इसके बारे में न तो कुछ भी निर्दिष्ट करता है। यह इस तथ्य के अनुरूप है कि करीब (2) इस बात की परवाह नहीं करता है कि आपने फ़ाइल कैसे खोली।

निम्नलिखित का एक त्वरित स्ट्रेस:

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-

इस बनाम:

exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-

दिखाता है कि दोनों मामलों में, बैश बिल्कुल एक ही काम करता है।

दो हल्के रोचक तथ्य


1
बैश मैन पेज ने आपके लिंक के हवाले से क्लोजिंग का उल्लेख किया है: यदि शब्द '-' का मूल्यांकन करता है, तो फाइल डिस्क्रिप्टर n बंद है।
स्टूडॉग

@studog स्रोत की जाँच के लिए धन्यवाद! मुझे लगता है कि यहाँ क्या हुआ है मैं बैश 3 के लिए एक स्थानीय मैनपेज देख रहा था, और फिर ऑनलाइन दस्तावेज़ से जुड़ा था, जो बैश 4 के लिए था। पुराने बैश 3 दस्तावेज़ में, समापन के बारे में वाक्यांश का वर्णन छोड़ दिया गया था [N]>&WORD: git .savannah.gnu.org / cgit / bash.git / tree / doc /…
स्टीवन डी

7

'<>' एफडी को बंद करने के बारे में क्यूंग्लम की समझ का एक उदाहरण।

यह http://tldp.org/LDP/abs/html/io-io-irectirect.html पर उन्नत बैश-स्क्रिप्टिंग गाइड से उद्धृत किया गया है

[j]<>filename
  #  Open file "filename" for reading and writing,
  #+ and assign file descriptor "j" to it.
  #  If "filename" does not exist, create it.
  #  If file descriptor "j" is not specified, default to fd 0, stdin.
  #
  #  An application of this is writing at a specified place in a file. 
  echo 1234567890 > File    # Write string to "File".
  exec 3<> File             # Open "File" and assign fd 3 to it.
  read -n 4 <&3             # Read only 4 characters.
  echo -n . >&3             # Write a decimal point there.
  exec 3>&-                 # Close fd 3.
  cat File                  # ==> 1234.67890
  #  Random access, by golly.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.