miércoles, enero 05, 2011

Todo es un archivo

Todo es un archivo... Es una de las cosas que se aprende en UNIX/Linux, que todo es un archivo, pero hay diferentes tipos de archivos, revisemos man test:

-b FILE
FILE exists and is block special
-c FILE
FILE exists and is character special
-d FILE
FILE exists and is a directory
-f FILE
FILE exists and is a regular file
-h FILE
FILE exists and is a symbolic link (same as -L)
-S FILE
FILE exists and is a socket

Claro, nada es tan simple como parece y hay muchos tipos de archivos :-), y con este preámbulo entremos en materia...
Si has usado algún comando y le has pasado la entrada estándar, por ejemplo cat < file.in, se te habrá ocurrido hacer lo mismo para tus scripts. Me llevo un tiempo encontrar una solución para este problema:

if [ ! -c /proc/$$/fd/0 ]
then
MENSAJE=$(cat -)
else
MENSAJE=""
fi


Cada proceso crea dentro de /proc/PID/fd/ la entrada estándar 0, salida estándar 1, y error estándar 2, lo que hacemos es comprobar que la entrada estándar del shell no sea un fichero de carácter especial (en este caso el teclado). Podemos probar que tipo de archivo es con estos comandos:


$ file /dev/fd/0
/dev/fd/0: symbolic link to `/dev/pts/0'
$ file /dev/pts/0
/dev/pts/0: character special

Se me hizo más fácil comprobar solo que no sea de tipo "character special", pero bien pudiéramos solo aceptar archivos normales:

if [ -f /proc/$$/fd/0 ]

$(cat -) lee la entrada estándar, si no hiciéramos la comprobación se quedaría esperando a que tecleáramos ctrl + d

Ya con esto podemos invocar nuestro script de estas dos formas sin problemas:

script.sh < archvio.txt
script.sh

a mi me sirvió para esto:

cat <<EOF | (cat -; for i in $@; do uuencode $i $(basename $i);done ) | mailx -s "$SUBJECT" $CORREO
$MENSAJE
EOF
Cosa que requiere más explicación y muchos más conceptos que no creo que llegue a explicar :-)...

nota: $$ nos devuelve el pid del programa en ejecución. Si son curiosos hagan un ls -l /proc/$$


No hay comentarios.: