Para ser más preciso, lo que >&0
es el descriptor de archivo duplicado 0 como descriptor de archivo 1. Si el programa stdin está solo abierto para lectura, entonces cuando su programa intente escribir en stdout (descriptor de archivo 1), obtendrá un error porque el descriptor de archivo 1 también está solo abierto para la lectura.
Usted puede demostrar esto escribiendo un pequeño script de shell que inspecciona sus propios descriptores de archivo:
10156115.sh:
#!/bin/bash
bash -c 'ls -l /proc/$$/fd' >&0
e invocarla con la entrada estándar de identificación personal, stdout y stderr:
$ touch stdin
$ ./10156115.sh <stdin> stdout 2> stderr
el resultado es que se obtiene el siguiente en stderr
:
ls: write error: Bad file descriptor
Sin embargo, por defecto, los tres son una terminal: (salida simplificado)
$ ls -l /proc/$$/fd
lrwx------ 0 -> /dev/pts/14
lrwx------ 1 -> /dev/pts/14
lrwx------ 2 -> /dev/pts/14
lrwx------ 255 -> /dev/pts/14
Por lo general, los tres son en realidad abierto de lectura + escribir, por lo que el >&0
redirección no tiene ningún efecto en absoluto si se utiliza solo de un caparazón normal.
¿Hay algún uso para esto?
no hay ninguno de los usos comunes de esto, pero es posible utilizarlo como un truco sucio para conseguir una manera de imprimir en el terminal si quien llama a su script redirige stdout
y stderr
, y por alguna razón usted no está capaz de cambiar eso:
if [ ! -t /dev/fd/1 -a ! -t /dev/fd/2 -a -t /dev/fd/0 ]; then
echo "My message that I really, really want to go to a terminal" >&0
fi
Pero no recomendaría realmente hacer esto.