La shell Bash maneja diferentes descriptores de archivo (file descriptors) para implementar las redirecciones. El descriptor número 0 corresponde con la entrada estándar (stdin), el 1 corresponde con la salida estándar (stdout), y el 2 con la salida estándar de errores (stderr). A diferencia de Bash, csh (intérprete de comandos por defecto en sistemas FreeBSD) no posee un descriptor de archivo (2) para la standard error (stderr). Aunque de todas formas es posible redirigir las salidas estándar y de errores a archivos separados.



Por ejemplo, si deseamos redirigir la salida estándar de un comando a un archivo de texto "salida.txt", y los errores a otro archivo "errores.txt", en Bash, utilizamos las siguientes redirecciones:

comando > salida.txt 2> errores.txt

Cabe recordar que el caracter especial > redirige por defecto la salida estándar y el caracter < redirige por defecto a la entrada estándar. Por ende, para redirigir la standard error, se debe especificar el descriptor de archivo 2 antes del símbolo >.

En csh no existe el descriptor de archivo 2 por lo tanto en principio sólo es posible redirigir ambas salidas (standard y error) a un mismo archivo utilizando el caracter &:

comando >& salida_y_errores.txt

Aunque csh no la llama standard error, sino diagnostic output, es decir, "salida de diagnóstico" en español, la cual se identifica con el caracter ampersand (&).

Sin embargo, es posible redirigir la salida estándar (standard output) y salida de diagnóstico (diagnostic output) hacia archivos separados utilizando una manganeta, la cual consiste en ejecutar el comando desde una subshell, donde se capture sólo la salida estándar, para luego capturar la salida de diagnóstico en la shell actual:

( comando > salida.txt ) >& errores.txt

Al emplear paréntesis, se inicia una subshell. Como dentro de dicha subshell sólo se captura la salida estándar (la cual se redirige al archivo "salida.txt"), la salida de diagnóstico será reenviada a la shell original. Luego se redirige tanto la salida estándar como la salida de diagnóstico al archivo "errores.txt", pero como la salida estándar ha sido capturada previamente en la subshell, sólo queda la salida de diagnóstico.

Veamos un ejemplo. Voy a intentar borrar dos archivos, uno que existe, llamado "pepe", y otro que no existe, llamado "noexiste". Al ejecutar el comando rm en modo verboso (-v) voy a tener salida estándar (nombres de archivos que se están borrando). Pero además voy a tener salida de diagnóstico informando que se están intentando borrar archivos inexistentes:

root@hal9000:~ # touch pepe
root@hal9000:~ # ls pepe
pepe
root@hal9000:~ # ls noexiste
ls: noexiste: No such file or directory
root@hal9000:~ # rm -v pepe noexiste 
pepe
rm: noexiste: No such file or directory
root@hal9000:~ # touch pepe
root@hal9000:~ # ( rm -v pepe noexiste > rm.salida ) > & rm.errores
root@hal9000:~ # cat rm.salida
pepe
root@hal9000:~ # cat rm.errores 
rm: noexiste: No such file or directory

Para más información consultar la página de manual de csh:

man 1 csh


Tal vez pueda interesarte


Compartí este artículo