3 <और 1 क्या करता है?


14

मैं समझता हूं कि execवर्तमान शेल पर I / O पुनर्निर्देशन कर सकता है, लेकिन मैं केवल उपयोग की तरह देखता हूं:

exec 6<&0   # Link file descriptor #6 with stdin.
            # Saves stdin.

exec 6>&1   # Link file descriptor #6 with stdout.
            # Saves stdout.

इससे मैं समझता हूं कि <इनपुट स्ट्रीम के >लिए है, आउटपुट स्ट्रीम के लिए है। तो क्या करता exec 3<&1है?

पुनश्च: मुझे यह चमगादड़ स्रोत कोड से मिला


@ ग्नोक स्पष्ट रूप से सही है, लेकिन यह ध्यान दिया जाना चाहिए कि exec 3<&1इससे अलग 3<&1है कि बाद वाला एक एकल आदेश को प्रभावित करेगा जबकि पूर्व वर्तमान शेल को प्रभावित करता है।
मिकसेर

जवाबों:


14

से bash manpage:

Duplicating File Descriptors
       The redirection operator

              [n]<&word

       is used to duplicate input file descriptors.  If word expands to one or
       more  digits,  the file descriptor denoted by n is made to be a copy of
       that file descriptor.  If the digits in word  do  not  specify  a  file
       descriptor  open for input, a redirection error occurs.  If word evalu
       ates to -, file descriptor n is closed.  If n  is  not  specified,  the
       standard input (file descriptor 0) is used.

       The operator

              [n]>&word

       is  used  similarly  to duplicate output file descriptors.  If n is not
       specified, the standard output (file descriptor 1)  is  used.   If  the
       digits  in word do not specify a file descriptor open for output, a re
       direction error occurs.  As a special case, if n is omitted,  and  word
       does not expand to one or more digits, the standard output and standard
       error are redirected as described previously.

मैंने कुछ डिबग के साथ किया strace:

sudo strace -f -s 200 -e trace=dup2 bash redirect.sh

के लिए 3<&1:

dup2(3, 255)                            = 255
dup2(1, 3)                              = 3

के लिए 3>&1:

dup2(1, 3)                              = 3

के लिए 2>&1:

dup2(1, 2)                              = 2

ऐसा लगता है कि 3<&1वैसा ही करें जैसे कि 3>&1डिस्क्रिप्टर 3 को फाइल करने के लिए स्टडआउट को डुप्लिकेट करना।


मैनपेज से, मैं उम्मीद करूंगा कि यह पुनर्निर्देशन त्रुटि को फेंक देगा क्योंकि इनपुट के लिए स्टडआउट खुला नहीं है। हालाँकि, यह वास्तव में डुप्लिकेट स्टड (जो & 0 है) करता है। कैसे?
ओरियन

2
@orion: आंतरिक रूप से, समान dup2()syscall का उपयोग किसी भी प्रकार के फ़ाइल डिस्क्रिप्टर के लिए किया जाता है; बैश x>&yबनाम x<&yसिंटैक्स चीनी है। इसके अलावा, जब stdio एक tty से जुड़ा होता है, तो tty डिवाइस को अक्सर पढ़ने + लिखने के लिए खोला जाता है और 0 से 1 और 2. से दोहराया जाता है
user1686

@ वैवाहिकता इतनी exec 3<&1ही है exec >&3?
झांकई

नहीं, लेकिन यह जैसा है वैसा ही है exec 3>&1
user1686
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.