Primeiro, em um comando simples (basicamente, o nome de um programa seguido por alguns argumentos), a posição relativa de argumentos e redirecionamentos não importa. Você pode até ter redirecionamentos antes do nome do comando. Os seguintes são todos equivalentes:
foo --bar qux >out 2>err
foo >out --bar 2>err
>out 2>err foo --bar qux
(Eu não vou listar todas as possibilidades.) É comum colocar os redirecionamentos no final, então você pode surpreender um futuro leitor se você não fizer isso. No entanto, é apenas uma questão de estilo. Há algum benefício em colocar redirecionamentos de entrada antes dos redirecionamentos de comando e saída, principalmente em pipelines, porque mantém a ordem de leitura idêntica à ordem de processamento:
<input.txt command1 | command2 | command3 >output.txt
(contraste command1 <input.txt | command2 …
, que coloca a origem após a primeira etapa de processamento).
Nos comandos compostos, você precisa colocar os redirecionamentos no final; Por exemplo, nos snippets a seguir, você não pode colocar o redirecionamento em nenhum outro lugar:
while some_predicate; do some_action; done <in >out
{ command1; command2; } <in >out
Quando há vários redirecionamentos, o pedido é importante se eles se sobrepuserem, ou seja, se eles tiverem descritores de arquivos em comum. Consulte Ordem dos redirecionamentos
Em um pipeline, os redirecionamentos se aplicam a cada comando canalizado. Nos seus exemplos, os redirecionamentos se aplicam a (1) somente o comando sort
, (2,3) o comando echo
. Como explicado acima, (2) e (3) são equivalentes.
Em (2) e (3), a saída de echo
acaba no mesmo lugar em que estava antes do redirecionamento. Se você tivesse escrito echo -en "C\nB\nA\n" >&2 | sort
, não haveria saída para stdout a partir do comando no lado esquerdo do pipe, então sort
veria um stdin vazio.
Você pode redirecionar a entrada ou a saída de um bloco de comandos, colocando-os entre chaves:
{ command1 | command2; } 2>error.log
Eu suponho que sua escolha de redirecionamentos foi apenas para fins de demonstração - 2>/dev/stdout >&2
é uma maneira complexa de escrever 2>&1
(redirecionar erro padrão (ou seja, fd 2) para onde quer que a saída padrão vá). / p>