Algunos trucos sobre redireccionamiento
Algunas particularidades de sintaxis sobre esto pueden tener comportamientos importantes. Hay algunas pequeñas muestras sobre redirecciones, STDERR
, STDOUT
, y los argumentos de pedidos .
1 - ¿Sobrescribir o anexar?
Símbolo de redirección>
media .
>
significa enviar a como un archivo completo completo , sobrescribiendo el objetivo si existe (vea la noclobber
función bash en el # 3 más adelante).
>>
significa enviar además de agregaría al objetivo si existe.
En cualquier caso, el archivo se crearía si no existiera.
2 - ¡La línea de comando de shell depende del orden!
Para probar esto, necesitamos un comando simple que envíe algo en ambas salidas :
$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan 7 11:49 /tmp
(Esperando que no tenga un directorio llamado /tnt
, por supuesto;). Bueno, lo tenemos !!
Entonces, veamos:
$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1
$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory
La última línea de comando volca STDERR
a la consola, y parece que no es el comportamiento esperado ... Pero ...
Si desea realizar un filtrado posterior sobre una salida, la otra o ambas:
$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan 7 12:02 /tmp --->
$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'
$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
Tenga en cuenta que la última línea de comando en este párrafo es exactamente la misma que en el párrafo anterior, donde escribí parece no ser el comportamiento esperado (por lo tanto, esto podría incluso ser un comportamiento esperado).
Bueno, hay algunos pequeños trucos sobre las redirecciones, para
realizar diferentes operaciones en ambas salidas :
$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2 2>&1 | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan 7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory
Nota: el &9
descriptor ocurriría espontáneamente debido a ) 9>&2
.
Anexo: nota!Con la nueva versión degolpetazo( >4.0
) hay una nueva característica y una sintaxis más sexy para hacer este tipo de cosas:
$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory
Y finalmente para un formato de salida en cascada de este tipo:
$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
1 O: drwxrwxrwt 118 root root 196608 Jan 7 12:29 /tmp
2 E: ls: cannot access /tnt: No such file or directory
Anexo: nota! La misma sintaxis nueva, en ambos sentidos:
$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
1 O: drwxrwxrwt 17 root root 28672 Nov 5 23:00 /tmp
2 E: ls: cannot access /tnt: No such file or directory
Donde STDOUT
pasar por un filtro específico, STDERR
a otro y finalmente ambas salidas fusionadas pasan por un tercer filtro de comando.
3 - Una palabra sobre noclobber
opción y >|
sintaxis
Eso se trata de sobrescribir :
Si bien le set -o noclobber
indica a bash que no sobrescriba ningún archivo existente, la >|
sintaxis le permite pasar por esta limitación:
$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:15 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:19 CET 2013
$ date > $testfile ; cat $testfile
Mon Jan 7 13:18:21 CET 2013
El archivo se sobrescribe cada vez, bueno ahora:
$ set -o noclobber
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan 7 13:18:21 CET 2013
Pase con >|
:
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:18:58 CET 2013
$ date >| $testfile ; cat $testfile
Mon Jan 7 13:19:01 CET 2013
Desarmar esta opción y / o preguntar si ya está configurado.
$ set -o | grep noclobber
noclobber on
$ set +o noclobber
$ set -o | grep noclobber
noclobber off
$ date > $testfile ; cat $testfile
Mon Jan 7 13:24:27 CET 2013
$ rm $testfile
4 - Último truco y más ...
Para redirigir ambos resultados de un comando dado, vemos que una sintaxis correcta podría ser:
$ ls -ld /tmp /tnt >/dev/null 2>&1
para este caso especial , hay una sintaxis de acceso directo: &>
... o>&
$ ls -ld /tmp /tnt &>/dev/null
$ ls -ld /tmp /tnt >&/dev/null
Nota: si 2>&1
existe, también 1>&2
es una sintaxis correcta:
$ ls -ld /tmp /tnt 2>/dev/null 1>&2
4b- Ahora, te dejaré pensar en:
$ ls -ld /tmp /tnt 2>&1 1>&2 | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
$ ls -ld /tmp /tnt 1>&2 2>&1 | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb 9 11:08 /tmp/
4c- Si estás interesado en más información
Puede leer el excelente manual presionando:
man -Len -Pless\ +/^REDIRECTION bash
en un golpetazo consola ;-)