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.