Toda aplicación tiene siempre tres descriptores de fichero abiertos, el 0 para la entrada estándar [stdin], el 1 para la salida estándar [stdout], y el 2 para la salida de errores estándar [stderr]. Del 3 al 9 son descriptores adicionales [ver tuberias].
$ ls -l /proc/self/fd
$ exec 3>&1 > /tmp/salida.txt
$ exec 1>&3 3>&-
$ command > file 2>&1
$ exec 1>/dev/null
1.-
$ exec 3<>/tmp/archivo.txt (cualquier cosa que se envíe a este descriptor, acabará en el archivo)
Los siguientes comandos no mostraran salida en el terrminal
$ echo "Hola" >&3
$ tty >&3
$ cat /tmp/archivo.txt
Hola
/dev/pts/1
Cerrar el descriptor y volver a la normalidad
$ exec 3>&-
2.-
Lo mismo
$ exec 3>&1
$ exec 1> >(while read line; do echo "$(date): $line"; done > /tmp/log.txt)
Los siguientes comandos no mostraran salida en el terrminal
$ echo "Linux es un sistema genial"
$ who
$ tty
Cerrar el descriptor
$ exec 1>&3 3>&-
Muestra las 3 últimas salidas de los comandos
$ nano /tmp/log.txt
3.-
Tunel SSH con descriptors
$ exec 3<>/dev/tcp/google.com/80
$ echo -e "GET / HTTP/1.1\nHost: google.com\nConnection: close\n\n" >&3
$ cat <&3
Mostrará salida. Volver a la normalidad:
$ exec 3>&-
4.-
Adivinar el número mayor, menos o correcto con pipes
# Terminal 1: Servidor
$ mkfifo /tmp/guess_pipe
$ exec 3<>/tmp/guess_pipe
$ number=$((RANDOM % 100 + 1))
$ while read guess <&3; do
[ "$guess" -eq "$number" ] && echo "¡Correcto!" && break
[ "$guess" -lt "$number" ] && echo "Mayor" || echo "Menor"
done
Quedará a la espera de los números que se entren en la terminal 2
# Terminal 2: Cliente
$ exec 4>/tmp/guess_pipe
$ echo "50" >&4
$ echo "150" >&4