Saltar la navegación

Redirecciones

Como se ha comentado en un apartado anterior, el sistema operativo GNU/Linux asigna tres flujos de datos (ficheros) a cada comando que se ejecuta, que son la entrada estándar, la salida estándar y la salida de errores estándar. Todos los flujos de datos se identifican a través de un número, el descriptor del fichero, y a los ficheros anteriores les corresponden los número 0, 1 y 2, respectivamente.

Flujos estándar

GNU/Linux, por defecto, conecta los tres flujos de datos anteriores a ciertos dispositivos:

  • Entrada estándar conectada al teclado. Esto hace que cualquier comando que lea de la entrada estándar lo hará del teclado.
  • Salida estándar conectada a la pantalla. Esto hace que cualquier comando que escriba en la salida estándar lo hará sobre la pantalla.
  • Salida de errores estándar conectada a la pantalla. Esto hace que cualquier comando que escriba en la salida de errorer estándar lo hará sobre la pantalla. Normalmente sobre esta salida se escriben los mensajes de error de los comandos, y no se hace sobre la salida estándar.

Existen en GNU/Linux (en general en UNIX) una serie de operadores que pueden hacer que la conexión anterior cambie y a esto se le llama redireccionar.

Redirección de la salida estándar (>)

La sintaxis general de una redirección de la salida estándar es la siguiente:

orden > fichero

Por ejemplo, ls es un comando que manda el listado de los ficheros de uno o varios directorios a la salida estándar y los mensajes de error a la salida de error estándar. Si ejecutamos normalmente el comando, vemos la salida por pantalla, pero podemos redireccionar dicha salida a un fichero y guardarla ahí.

$ ls -l tmp
total 40
-rw-r--r-- 1 usuario vboxsf     0 sep  3 19:27 carta.txt
-rw-r--r-- 1 usuario vboxsf  5541 sep  3 19:30 cp.man
drwxr-sr-x 2 usuario vboxsf  4096 sep  3 19:30 d
-rw-r--r-- 1 usuario vboxsf 20981 sep  3 19:28 ls.man
-rw-r--r-- 1 usuario vboxsf  4061 sep  3 19:29 rm.man
$ ls -l tmp > listado
$ cat listado
total 40
-rw-r--r-- 1 usuario vboxsf     0 sep  3 19:27 carta.txt
-rw-r--r-- 1 usuario vboxsf  5541 sep  3 19:30 cp.man
drwxr-sr-x 2 usuario vboxsf  4096 sep  3 19:30 d
-rw-r--r-- 1 usuario vboxsf 20981 sep  3 19:28 ls.man
-rw-r--r-- 1 usuario vboxsf  4061 sep  3 19:29 rm.man

Con la redirección anterior si el fichero listado no existe, este se crea, pero si existiera se perdería su contenido y se sustituiría por la salida del comando ls. Este funcionamiento puede ser alterado con la opción de configuración del shell noclobber, la cual si está activa y el fichero listado existe, se produce un error y el comando no se ejecuta.

Redirección de la salida estándar (>|)

La sintaxis general es:

orden >| fichero

Este operador es igual que el anterior, con la diferencia de que no tiene en cuenta la opción noclobber del shell, es decir, que si el fichero de redireccionamiento existe y noclobber está activada, su contenido igualmente será sustituido por la salida del comando, sin dar ningún tipo de error.

$ touch listado
$ ls -l tmp > listado
$ set -o noclobber
$ ls -l tmp > listado
bash: listado: no se puede sobreescribir un fichero existente
$ ls -l tmp >| listado
$

Redirección de la salida estándar (>>)

La sintaxis general es:

orden >> fichero

Este operador de redirección de la salida estándar se diferencia del operador > en que si el fichero utilizado en la redirección existe, su contenido no es sustituido por la nueva información de salida, sino que acumula la nueva información.

$ ls -l tmp > listado
$ cat listado
total 40
-rw-r--r-- 1 usuario vboxsf     0 sep  3 19:27 carta.txt
-rw-r--r-- 1 usuario vboxsf  5541 sep  3 19:30 cp.man
drwxr-sr-x 2 usuario vboxsf  4096 sep  3 19:30 d
-rw-r--r-- 1 usuario vboxsf 20981 sep  3 19:28 ls.man
-rw-r--r-- 1 usuario vboxsf  4061 sep  3 19:29 rm.man
$ ls -l /tmp >> listado
$ cat listado
total 40
-rw-r--r-- 1 usuario vboxsf     0 sep  3 19:27 carta.txt
-rw-r--r-- 1 usuario vboxsf  5541 sep  3 19:30 cp.man
drwxr-sr-x 2 usuario vboxsf  4096 sep  3 19:30 d
-rw-r--r-- 1 usuario vboxsf 20981 sep  3 19:28 ls.man
-rw-r--r-- 1 usuario vboxsf  4061 sep  3 19:29 rm.man
total 20
drwx------ 2 Debian-gdm Debian-gdm 4096 sep  4 12:43 pulse-7VkmcczY5Xv0
drwx------ 2 usuario    usuario    4096 sep  4 12:43 pulse-cbBFsbArgdvz
drwx------ 2 root       root       4096 sep  4 12:42 pulse-PKdhtXMmr18n
drwx------ 2 usuario    usuario    4096 sep  4 12:43 ssh-8xH3Ae9sxl2J
drwxr-xr-x 2 usuario    usuario    4096 sep  4 12:43 tracker-usuario

Si el fichero de salida no existiera, se crearía. La opción noclobber no interviene aquí, pues el contenido previo del fichero no se pierde.

Redirección de la entrada estándar (<)

 La sintaxis general es:

orden < fichero

La orden cat cuando no recibe ningún fichero como argumento, lee datos de la entrada estándar y los mismos los escribe por la salida estándar. Usando la redirección de la entrada estándar podemos hacer que lea también de un fichero:

$ cat < listado
total 40
-rw-r--r-- 1 usuario vboxsf     0 sep  3 19:27 carta.txt
-rw-r--r-- 1 usuario vboxsf  5541 sep  3 19:30 cp.man
drwxr-sr-x 2 usuario vboxsf  4096 sep  3 19:30 d
-rw-r--r-- 1 usuario vboxsf 20981 sep  3 19:28 ls.man
-rw-r--r-- 1 usuario vboxsf  4061 sep  3 19:29 rm.man

Redirección de la entrada estándar (<<delimitador ó <<-delimitador)

Este tipo de redirección hace que el comando lea la entrada desde el texto que va a continuación del operador de redirección, hasta que encuentre una línea donde esté únicamente el delimitador (sin espacios en blanco en los márgenes).

En delimitador no se realiza la expansión de parámetros, ni la sustitución de comandos, ni la expansión aritmética, ni la expansión de nombres de ficheros. Si delimitador no está entrecomillado, todas las líneas que van después del operador son sometidas a expansión de parámetros, sustitución de comandos y expansión aritmética.

Si el operador de redirección es <<- entonces se eliminan todos los caracteres de tabulación marginales de las líneas de entrada y de la línea que contiene al delimitador.

$ var=HOLA
$ cat <<fin
> $var
> línea
> fin
HOLA
línea
$ cat <<'fin'
> $var
> línea
> fin
$var
línea

Redirección de la entrada estándar (<<<palabra)

La palabra es expandida y suministrada al comando como su entrada estándar.

$ var="Esto es un texto"
$ cat <<<var
var
$ cat <<<$var
Esto es un texto
$ cat <<<$(ls -l tmp)
total 40 -rw-r--r-- 1 usuario vboxsf 0 sep 3 19:27 carta.txt -rw-r--r-- 1 usuario vboxsf 5541 sep 3 19:30 cp.man...

 Redirección de la salida de error estándar (2>)

La sintaxis general es:

orden 2> fichero

Como la salida estándar y la salida de error estándar son dos flujos de información distintos, ocurre los siguiente:

$ ls -l tmp documentos > listado
ls: no se puede acceder a documentos: No existe el fichero o el directorio

Como el directorio documentos no existe, se produce un mensaje de error, y éste lo vemos por la pantalla, ya que los mensajes de error toman un camino distinto a la información normal del comando. Con el operador 2> podemos conseguir que la salida de error estándar vaya a otro sitio:

$ ls -l tmp documentos > listado 2> errores
$ cat errores
ls: no se puede acceder a documentos: No existe el fichero o el directorio

Con 2> sucede lo mismo que con > :

  • Si el fichero de salida no existe, entonces se crea.
  • Si el fichero existe y no está activada noclobber, entonces el contenido previo de dicho fichero se sobrescribe.
  • Si el fichero existe y está activada noclobber, entonces se produce un error y la orden no se ejecuta.

Observemos que el 2 proviene del número del descriptor de la salida de error estándar.

Redirección de la salida de error estándar (2>|)

La sintaxis general es:

orden 2>| fichero

Hace lo mismo que >| pero sobre la salida de error estándar.

Redirección de la salida de error estándar (2>>)

La sintaxis general es:

orden 2>> fichero

Hace lo mismo que >> pero sobre la salida de error estándar.

Redirección de la salida estándar y la salida de error estándar al mismo sitio (&>)

La sintaxis general es:

orden &> fichero

Este operador de redirección lo utilizaremos cuando queramos guardar sobre un mismo fichero la salida estándar y la salida de error estándar.

$ ls -l tmp documentos &> listado
$ cat listado
ls: no se puede acceder a documentos: No existe el fichero o el directorio
tmp:
total 40
-rw-r--r-- 1 usuario vboxsf     0 sep  3 19:27 carta.txt
-rw-r--r-- 1 usuario vboxsf  5541 sep  3 19:30 cp.man
drwxr-sr-x 2 usuario vboxsf  4096 sep  3 19:30 d
-rw-r--r-- 1 usuario vboxsf 20981 sep  3 19:28 ls.man
-rw-r--r-- 1 usuario vboxsf  4061 sep  3 19:29 rm.man

También &> funciona igual que > en cuanto a si el fichero existe o no y la opción noclobber.

Redirección de la salida estándar y la salida de error estándar al mismo sitio (&>>)

La sintaxis general es:

orden &>> fichero

Como en >>, añade la salida al fichero.

Redirección para conectar la salida estándar de un comando con la entrada estándar de otro comando (|)

La sintaxis general es:

orden1 | orden2

Con este operador podemos interconectar la salida estándar de orden1 con la entrada estándar de orden2.

$ ls -l | wc -l
16

Con el ejemplo anterior contamos el número de líneas que nos muestra el listado largo.

Este operador de redirección es el más utilizado, pues es muy habitual en UNIX construir comandos complejos uniendo la salida de un comando simple con la entrada de otro comando simple y así sucesivamente, filtrando información hasta llegar al objetivo.

Redirección para conectar la salida estándar y la salida de error estándar con la entrada estándar (|&)

La sintaxis general es:

orden1 |& orden2

Con este operador podemos interconectar la salida estándar y la salida de error estándar de orden1 con la entrada estándar de orden2.

$ ls -l tmp carta.txt documentos | wc -l
ls: no se puede acceder a carta.txt: No existe el fichero o el directorio
ls: no se puede acceder a documentos: No existe el fichero o el directorio
7
$ ls -l tmp carta.txt documentos |& wc -l
9

Redirección de la salida de error a la salida estándar (2>&1)

La sintaxis general es:

orden 2>&1

Este operador hace que la salida de error y la salida estándar vayan juntas por la salida estándar.

ls -l f.txt g.txt h.txt 2>&1 | less

Redirección de la salida estándar a la salida de error estándar (1>&2)

La sintaxis general es:

orden 1>&2

Este operador hace que la salida estándar y la salida de error estándar vayan juntas por la salida de error estándar.

Licencia: licencia de software libre GPL