-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:
Cosa que requiere más explicación y muchos más conceptos que no creo que llegue a explicar :-)...
cat <<EOF | (cat -; for i in $@; do uuencode $i $(basename $i);done ) | mailx -s "$SUBJECT" $CORREO
$MENSAJE
EOF
nota: $$ nos devuelve el pid del programa en ejecución. Si son curiosos hagan un ls -l /proc/$$
No hay comentarios.:
Publicar un comentario