Jugando con redirección en Bash Debian Day 2017 La Paz Este post tiene un artículo de consulta en: https://rmgss.net Rodrigo Garcia
Un pedazo de la filosofía UNIX Haz que cada programa haga bien una cosa. Espera que la salida de cada programa se convierta en la entrada de otro programa, incluso desconocido. The UNIX philosophy is documented by Doug McIlroy
Streams y File-descriptors Con la consola BASH (bourne again shell) se aprovechan los file-descriptors y streams para enviar la salida de un programa a un lugar, luego otro programa puede sacarla de ese lugar y utilizarla como su entrada. lsof -p $BASHPID ls /proc/<PID>/fd/
Streams y File-descriptors File-descriptor (FD) Stdin (Entrada estándar) Stdout (Salida estándar) 1 Stderr (Error estándar) 2 lsof +f g -ap $BASHPID -d 0,1,2
Operadores comando > archivo comando >> archivo comando1 | comando2 comando 2> archivo
Jugemos un poco ls $HOME > lista ls -l $HOME >> lista ls no.existe > lista ls no.existe 2>> lista ls -R /var/log | grep “*.txt” find $HOME | grep “txt$” > mis_txts
¿Salida estándar? Veamos a donde apunta: lsof +f g -ap $BASHPID -d 1 A mi me aparece: /dev/pts/1 y /dev/pts/1 es esta misma terminal por eso lo que sale en la salida estándar aparece en la pantalla. Si la redirigimos: ls -l $HOME > archivo Ahora stdout saldrá en “archivo”
¿Entrada estandar? ls no lee nada de stdin por eso: Digamos: echo “/var/log” > arch Luego: ls < arch # QUE? No sera : cat arch | ls #?? Es: cat arch | xargs ls # Ahhh! ls no lee nada de stdin por eso: ls < arch # no funciona En cambio si funciona: read A < arch echo $A
Error estándar Es similar a stdout solo que típicamente ahí solo van los mensajes de error. mv no.ex ex mv no.ex ex 2> errores combinando: ls no.existe 2>&1 reporte cat reporte Que pasa aqui, donde esta “reporte”?
El orden importa! nada hace que se apunte a “reporte” ls no.existe 2>&1 reporte # hace: ----------------------------------- File descriptor (FD) Archivo 0 ---------> /dev/pts/5 1 ----·----> /dev/pts/5 / 2 --´ nada hace que se apunte a “reporte”
Se evalúan primero los operadores antes que los comandos ls algo-que-no-existe > reporte 2>&1 >: File descriptor (FD) Archivo 0 ---------> /dev/pts/5 1 ---------> archivo 2 ---------> /dev/pts/5 2>&1: 1 -----·---> reporte / 2 ---´
Ahora se puede jugar más ps aux --sort -rss | head for nombre in * do NS=$(echo $nombre | tr " " "_") mv "$nombre" "$NS" 2> /dev/null done
Aprovechando algunos comandos tar -zcvf - carpeta/ | gpg \ -- symmetric --no-use-agent \ -- passphrase "123456" > \ carpeta.gpg # descifrar gpg --decrypt --no-use-agent \ -- passphrase \ carpeta.gpg | \ tar -C . -xvf -
Creative Commons Attribution 4.0 International License. Gracias Esta presentación está bajo la licencia libre: Creative Commons Attribution 4.0 International License. Referencia más completa sobre esta charla: https://rmgss.net