V
e
r

l
i
s
t
a
d
o

tractatus@lapipaplena:/# _

 

descriptor

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
contiene un enlace simbólico para cada descriptor de archivo abierto por la terminal
$ exec 3>&1 > /tmp/salida.txt
que el descriptor 3 conecte su salida a donde la conecta el descriptor 1 [la pantalla] y después que este último se conecte al archivo /tmp/salida.txt. La consecuencia es que a partir de este momento todas las órdenes usarán como salida estándar el archivo
$ exec 1>&3 3>&-
restituye la situación inicial, que el descriptor 1 conecte su salida a la del descriptor 3, o sea, la pantalla y, después, cierra el conector 3. Por tanto, a partir de ese momento, las órdenes volverán a mostrar su salida estándar por pantalla
$ command > file 2>&1
redirige la salida estándar y la salida estándar de error de command al archivo file
$ exec 1>/dev/null
mandamos a /dev/null la salida estándar de cualquier comando que ejecutemos a continuación en la misma shell

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

Navegando por staredsi.eu aceptas las cookies que utilizamos en esta web. Más información: Ver política de cookies
[0] 0:bash*
4120 entradas - Acerca del Tractatus
La Pipa Plena 2025