Was macht Exec 3 <& 1?

13

Ich verstehe, dass execdie I / O-Umleitung für die aktuelle Shell ausgeführt werden kann, sehe aber nur die Verwendung wie folgt:

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

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

Daraus verstehe ich, dass dies <für den Eingabestream, >für den Ausgabestream ist. Also, was macht exec 3<&1man?

PS: Ich habe das aus dem Bats-Quellcode heraus gefunden

Zhenkai
quelle
@Gnouc ist offensichtlich korrekt, aber es sollte beachtet werden, dass der exec 3<&1Unterschied 3<&1darin besteht, dass Letzterer einen einzelnen Befehl beeinflusst, während Ersterer die aktuelle Shell beeinflusst.
mikeserv

Antworten:

14

Von 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.

Ich habe ein paar Debugs gemacht mit strace:

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

Für 3<&1:

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

Für 3>&1:

dup2(1, 3)                              = 3

Für 2>&1:

dup2(1, 2)                              = 2

Dies entspricht anscheinend 3<&1genau dem 3>&1Kopieren von stdout in Dateideskriptor 3.

cuonglm
quelle
Von der Manpage würde ich erwarten, dass sie einen Umleitungsfehler auslöst, da stdout nicht für Eingaben geöffnet ist. Es dupliziert jedoch wirklich stdin (was & 0 ist). Wie?
Orion
2
@orion: Intern wird derselbe dup2()Syscall für jede Art von Dateideskriptor verwendet. bashs x>&yvs x<&yist nur syntax zucker. Wenn stdio an ein tty angeschlossen ist, wird das tty-Gerät sehr oft zum Lesen und Schreiben geöffnet und nur von 0 auf 1 und 2 dupliziert.
user1686
@grawity so exec 3<&1ist das gleiche wie exec >&3?
Zhenkai,
Nein, aber es ist dasselbe wie exec 3>&1.
user1686