Minha pergunta é sobre a precedência de redirecionamento é bash. Suponha que você tenha um comando:
cmd1 < cmd2 > cmd3
Seria traduzir para:
(cmd1 < cmd2) > cmd3
Ou
cmd1 < (cmd2 > cmd3)
fonte
Minha pergunta é sobre a precedência de redirecionamento é bash. Suponha que você tenha um comando:
cmd1 < cmd2 > cmd3
Seria traduzir para:
(cmd1 < cmd2) > cmd3
Ou
cmd1 < (cmd2 > cmd3)
O padrão POSIX especifica que o redirecionamento do shell é da esquerda para a direita; isto é, a ordem é significativa:
A construção
2>&1
é frequentemente usada para redirecionar o erro padrão para o mesmo arquivo da saída padrão. Como os redirecionamentos ocorrem do começo ao fim, a ordem dos redirecionamentos é significativa. Por exemplo:ls > foo 2>&1
direciona a saída padrão e o erro padrão para o arquivo
foo
. Contudo:ls 2>&1 > foo
direciona apenas a saída padrão para o arquivo
foo
porque o erro padrão foi duplicado como saída padrão antes que a saída padrão fosse direcionada ao arquivofoo
.
bash
opera em conformidade com esta parte da 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
$
Quanto à tubulação:
Como a atribuição de pipeline de entrada ou saída padrão ou ambas ocorre antes do redirecionamento, ela pode ser modificada pelo redirecionamento. Por exemplo:
$ command1 2>&1 | command2
envia a saída padrão e o erro padrão de
command1
para a entrada padrão decommand2
.
ls > foo 2>&1
significar redirecionar stdout para foo e depois redirecionar stderr para stdout. Portanto, isso não deve funcionar. Da mesma forma, o segundo comando deve funcionar. O que estou perdendo aqui?bash
geralmente é compatível com POSIX, exceto nas situações descritas aqui , onde obash
comportamento padrão é diferente. Para tornar abash
conformidade mais, você pode usar a--posix
opçãols > foo 2>&1
funciona assim: primeiro, a saída padrão é redirecionada parafoo
, então, o erro padrão é redirecionado para a saída padrão, que agora é o arquivofoo
. O segundo exemplo,ls 2>&1 > foo
opera assim: o erro padrão é redirecionado para a saída padrão antes que a saída padrão seja redirecionada parafoo
, portanto, o erro padrão é repetido localmente em vez de ser direcionado ao arquivo.ls 2>&1 >foo
talvez você possa pensar assim. stderr de 'ls' é redirecionado para stdout. Isso vai acontecer! Ele irá para onde o stdout está atualmente designado, independentemente de quaisquer outras diretivas relacionadas ao stdout .. (porque essa é sua diretiva prime / first ). e ele faz ... Lembre-se: stderr não é transmutado para realmente se tornar stdout .. Ele apenas vai para onde stdout foi atribuído no momento da diretiva. (por exemplo, o terminal)Eu acho que também não. Um par de parênteses significa uma subcasca. Mas, neste caso, nenhum sub-shell será iniciado por causa do redirecionamento. Bash simplesmente alimenta
cmd2
stdin e alimenta stdoutcmd3
.Estou pensando, você quer dizer algo assim
cmd1 | cmd2 | cmd3
? Porque vocêcmd2
ecmd3
normalmente são arquivos normais em vez de "cmds".fonte