Co robi exec 3 <i 1?

14

Rozumiem, że execmożna wykonać przekierowanie we / wy w bieżącej powłoce, ale widzę tylko takie użycie, jak:

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

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

Rozumiem, że <to jest dla strumienia wejściowego, >jest dla strumienia wyjściowego. Co więc robi exec 3<&1?

PS: Znalazłem to z kodu źródłowego Batsa

Zhenkai
źródło
@Gnouc jest oczywiście poprawny, ale należy zauważyć, że exec 3<&1różni się od 3<&1tego, że to drugie wpłynie na jedno polecenie, podczas gdy pierwsze wpływa na bieżącą powłokę.
mikeserv

Odpowiedzi:

14

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

Zrobiłem kilka debugowania z strace:

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

Dla 3<&1:

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

Dla 3>&1:

dup2(1, 3)                              = 3

Dla 2>&1:

dup2(1, 2)                              = 2

Wygląda na to, że 3<&1robi dokładnie to samo, co 3>&1kopiowanie standardowego wejścia do deskryptora pliku 3.

Cuonglm
źródło
Na stronie podręcznika spodziewam się, że zgłosi błąd przekierowania, ponieważ wejście standardowe nie jest otwarte dla danych wejściowych. Jednak tak naprawdę robi duplikat stdin (czyli & 0). W jaki sposób?
Orion
2
@orion: Wewnętrznie to samo wywołanie systemowe dup2()jest używane dla każdego rodzaju deskryptora pliku; bash's x>&yvs x<&yto po prostu cukier składniowy. Ponadto, gdy stdio jest podłączone do tty, urządzenie tty jest bardzo często otwierane do odczytu i zapisu i po prostu duplikowane od 0 do 1 i 2.
1686
@grawity, więc exec 3<&1to samo co exec >&3?
Zhenkai
Nie, ale jest taki sam jak exec 3>&1.
user1686,