Documentos Here y Líneas HERE
Probablemente conozcas los documentos HERE
. Una forma
comoda de hacer que nuestros scripts escriban varias lineas en pantalla
de una sola vez.
echo << EOM Esto son varias lineas que podemos imprimir Todo lo que escribamos hasta la marca aparecera en la consola EOM
Tambien los podemos utilizar para generar ficheros cuando no tenemos un editor de textos
cat << EOM > hola.c > #include <stdio.h> > int main(void) { puts("Hola Mundo");} > EOM
Pero en ocasiones solamente necesitamos una línea. Los siguientes comandos son equivalentes en bash
$ base64 <<< "Codifica esto en base64" $ echo "Codifica esto en base64" | base64
Finalmente, la sustitución de procesos nos permite utilizar la
entrada o la salida de un comando como entrada o salida de otro. La
sustitución de procesos crea un pipe
con el que redirigir
la entrada o salida de procesos. Veamos un par de ejemplos
Un ejemplo clásico del uso de este operador es la comparación de la salida de dos procesos. En general, para poder hacer eso, deberiamos redireccionar la salida de cada proceso a un fichero y luego comparar esos ficheros. Pero en su lugar podemos hacer lo siguiente.
$ diff <(cmd1) <(cmd2)
Observad que no hay espacio entre <
y (
.
De la misma forma podemos redireccionar la salida de un comando
$ echo "Hola mundo" | tee >(md5sum) >(sha256sum)
En este caso el problema esta en que tee
espera un
fichero como parámetro, no un comando y por lo tanto no podriamos enciar
nuestra cadena de texto a los dos programas que calculan el hash.
Lista errores del sistema
Durante el desarrollo de programas en C es normal obtener errores
como valores numericos en la variable global errno
. Podemos
utilizar la función perror
para traducirlos en una cadena
comprensible para nosotros, o podemos utilizar el comando
errno
para traducirlos… en caso de que, por ejemplo, el
programador de alguna utilidad simplemente nos devuelva un críptico
error 10
$ errno -l # Muestra todos los errores del sistema $ errno 10 # Muestra descripcion del error 10 ECHILD 10 No child processes $ errno EAGAIN # Muestra descripcion del error EAGAIN EAGAIN 11 Resource temporarily unavailable
Si el programa no está instalado, podréis encontrarlo en el paquete
moreutils
al menos en la distribucion Debian.
Ejecutar comandos desde tu editor de textos sobre documento
Sabias que puedes ejecutar comandos shell sobre bloques de texto que estas editando en vim. Por ejemplo, puedes ordenar alfabeticamente una lista que hayas escrito desordenada en tu documento utilizando el comando:
:%!cmd
El %
significa aplicar el comando a todo el fichero,
pero tambien podeis usarlo en modo visual.
EN emacs podies hacer lo mismo utilizando el siguiente comando.
CTRL + U ALT + | cmd
Servidor FTP temporal
Hay muchas formas de transferir ficheros rápidamente entre
ordenadores de una red. Aquí os traemos una opción más, utilizando el
modulo pyftplib
. Poner en marcha un servidor web es tan
sencillo como esto.
$ python -m pyftpdlib --directory=FTP --port=2121 --write
Para acceder al servidor utilizad el nombre de usuario
anon
Podéis instalar pyftplib
con el comando.
$ pip install --user pyftpdlib
Enviar notificaciones al escritorio
A veces tenemos que ejecutar procesos muy largos que pueden tardar
mucho tiempo en ejecutarse y estaría bien hacer que alguien nos avise
cuando hayan terminado. El comando notify-send
nos permite
enviar notificaciones al escritorio.
notify-send -t 3000 --icon=video-television "Tus videos ya han sido comprimidos!"
Este comando mostrará durante tres segundo el mensaje que pasamos como parámetro junto aun icono relacionado con el vídeo.
Ejecutar comando cada vez que un fichero cambia
Para conseguir esto podemos utilizar la utilidad ‘inotifywait’ en un bucle como el que se muestra a continuacion. En este caso monitorizamos los eventos de cerrar y escribir en el fichero.
while inotifywait -e close_write document.tex do make done
Alternativamente podéis utilizar la utilidad entr
, la
cual también nos permite varias opciones. Consultad la página del manual
para todos los detalles. El ejemplo anterior lo podríamos escribir con
entr
de esta forma:
$ echo document.tex | entr -a make $ entr -a make <<< document.tex
■