Mi pregunta es sobre la precedencia de la redirección es bash. Supongamos que tiene un comando:
cmd1 < cmd2 > cmd3
¿Se traduciría a:
(cmd1 < cmd2) > cmd3
O
cmd1 < (cmd2 > cmd3)
fuente
Mi pregunta es sobre la precedencia de la redirección es bash. Supongamos que tiene un comando:
cmd1 < cmd2 > cmd3
¿Se traduciría a:
(cmd1 < cmd2) > cmd3
O
cmd1 < (cmd2 > cmd3)
El estándar POSIX especifica que la redirección de shell es de izquierda a derecha; es decir, el orden es significativo:
La construcción
2>&1
se usa a menudo para redirigir el error estándar al mismo archivo que la salida estándar. Dado que las redirecciones tienen lugar de principio a fin, el orden de las redirecciones es significativo. Por ejemplo:ls > foo 2>&1
dirige tanto la salida estándar como el error estándar al archivo
foo
. Sin embargo:ls 2>&1 > foo
solo dirige la salida estándar al archivo
foo
porque el error estándar se duplicó como salida estándar antes de que la salida estándar se dirigiera al archivofoo
.
bash
opera de acuerdo con esta parte de la norma:
$ ls doesnotexist > foo 2>&1
$ cat foo
ls: cannot access doesnotexist: No such file or directory
$ ls doesnotexist 2>&1 > foo
ls: cannot access doesnotexist: No such file or directory
$ cat foo
$
En cuanto a la tubería:
Debido a que la asignación de canalización de entrada estándar o salida estándar, o ambas, tiene lugar antes de la redirección, se puede modificar mediante la redirección. Por ejemplo:
$ command1 2>&1 | command2
envía tanto la salida estándar como el error estándar de
command1
a la entrada estándar decommand2
.
ls > foo 2>&1
significar redirigir stdout a foo y luego redirigir stderr a stdout. Entonces esto no debería funcionar. Del mismo modo, el segundo comando debería funcionar. ¿Que me estoy perdiendo aqui?bash
es generalmente compatible con POSIX, excepto en las situaciones descritas aquí , donde elbash
comportamiento predeterminado difiere. Parabash
conformar más, puede usar la--posix
opción.ls > foo 2>&1
funciona así: primero, la salida estándar se redirige afoo
, luego, el error estándar se redirige a la salida estándar, que ahora es el archivofoo
. El segundo ejemplo,ls 2>&1 > foo
funciona así: el error estándar se redirige a la salida estándar antes de que se redirija la salida estándarfoo
, por lo que el error estándar se repite localmente en lugar de dirigirse al archivo.ls 2>&1 >foo
tal vez puedas pensarlo así. stderr de 'ls' se redirige a stdout. Esto va a pasar! Irá a donde stdout está asignado actualmente , independientemente de las directivas adicionales relacionadas con stdout ... (porque esta es su directiva principal / primera ). Luego viene otra directiva que dice que stdout irá a "foo", y lo hace ... Recuerde: stderr no se transmuta para convertirse en stdout en realidad ... Simplemente va a donde se asignó stdout en el momento de la directiva. (por ejemplo, la terminal)Supongo que tampoco. Un par de paréntesis significa una subcapa. Pero en este caso, no se iniciará ningún sub-shell debido a la redirección. Bash simplemente alimenta
cmd2
a stdin y alimenta a stdoutcmd3
.Estoy pensando, ¿quieres decir algo así
cmd1 | cmd2 | cmd3
? Porque sucmd2
ycmd3
son archivos normales en lugar de "cmds".fuente