¿Qué hace exec 3 <& 1?

13

Entiendo que execpuede hacer la redirección de E / S en el shell actual, pero solo veo el uso como:

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

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

De eso entiendo que <es para el flujo de entrada, >es para el flujo de salida. Entonces, ¿qué hace exec 3<&1?

PD: encontré esto del código fuente de Bats

Zhenkai
fuente
@Gnouc es obviamente correcto, pero debe tenerse en cuenta que exec 3<&1difiere de 3<&1que este último afectará a un solo comando, mientras que el primero afecta al shell actual.
mikeserv

Respuestas:

14

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

Hice algunas depuraciones con strace:

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

Para 3<&1:

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

Para 3>&1:

dup2(1, 3)                              = 3

Para 2>&1:

dup2(1, 2)                              = 2

Parece que 3<&1hacer exactamente lo mismo que 3>&1duplicar stdout al descriptor de archivo 3.

Cuonglm
fuente
Desde la página de manual, esperaría que arroje un error de redirección porque stdout no está abierto para la entrada. Sin embargo, realmente duplica stdin (que es & 0). ¿Cómo?
orion
2
@orion: Internamente, dup2()se utiliza la misma llamada al sistema para cualquier tipo de descriptor de archivo; bash x>&yvs x<&yes solo sintaxis de azúcar. Además, cuando stdio está conectado a un tty, el dispositivo tty a menudo se abre para leer + escribir y simplemente se duplica de 0 a 1 y 2.
user1686
@grawity exec 3<&1es igual que exec >&3?
Zhenkai
No, pero es lo mismo que exec 3>&1.
user1686