Resposta curta: >
deve ser seguido por um nome de arquivo ou &n
(n é um número) e |
deve ser seguido por outra chamada de comando.
Detalhes: Na sintaxe do shell, uma chamada para algum comando contém vários componentes. Exemplo:
A=foo 2>/dev/null B=bar cmd arg1 arg2 >file 3>&4 arg3
Aqui, os parâmetros 2>/dev/null
, >file
e 3>&4
são parâmetros especiais (contendo um >
un sem escape), eles são usados para estabelecer redirecionamentos io e podem aparecer em qualquer lugar na linha de comando. Filedesciptor 2 é redirecionado para /dev/null
, filedescriptor 1
(implícito) é redirecionado para file
e filedescriptor 3
é redirecionado para o que o filedescriptor 4 estava vinculado.
Então, entre os demais parâmetros, A=foo
e B=bar
contêm =
, então eles não são considerados como o nome do comando: eles fornecem valores específicos para variáveis de ambiente do processo a ser lançado.
Em seguida, vem o comando cmd
e os argumentos reais: arg1
, arg2
, arg3
.
O canal |
não faz parte de uma chamada de comando, ele vincula duas dessas invocações. Exemplo:
CC=gcc make 2>&1 | LESS=--quit-at-eof less
A saída no filedescriptor 1 pelo primeiro processo será recebida como entrada no filedescriptor 0 pelo segundo processo, através de um “pipe” que age como um buffer.
-
1. De fato, os caracteres especiais como >
são vistos algumas vezes seguidos por um espaço. Mesmo que isso seja permitido, as duas sequências (separadas por espaço) devem ser entendidas como uma "entidade" única.