Leia atentamente a seção "Redirecionamento" do manual: link
A forma cmd >&2
é descrita na seção "3.6.8 Descrevendo descritores de arquivos"
[n]>&word
Aqui, n
não é especificado, então o padrão é "1" significando stdout: estamos redirecionando stdout para o descritor de arquivo "2" significando stderr. Toda saída normal do comando será enviada para stderr.
A forma cmd &>2
é descrita na seção "3.6.4 Redirecionando a saída padrão e o erro padrão"
There are two formats for redirecting standard output and standard error:
&>word
and
>&word
Of the two forms, the first is preferred. This is semantically equivalent to
>word 2>&1
Neste caso, "word" é "2", então temos stdout e stderr do comando sendo enviado para um arquivo chamado 2
.
$ sh -c 'echo stdout; echo stderr >&2' &>2
$ ls -l 2
-rw-rw-r-- 1 jackman jackman 14 May 14 21:40 2
$ cat 2
stdout
stderr
Eu achei isso tudo muito confuso quando eu estava aprendendo. Continue assim. Lembre-se de que os redirecionamentos ocorrem na ordem estrita da esquerda para a direita. Por exemplo
$ sh -c 'echo stdout; echo stderr >&2' >&2 2>some.file
stdout
$ cat some.file
stderr
Por que a string "stdout" não é enviada para esse arquivo?
Da esquerda para a direita:
-
1>&2
- Penso nisso como "descritor de arquivo de redirecionamento 1 para qualquer que seja o descritor de arquivo 2 atualmente em uso ". Atualmente, fd 2 aponta para / dev / stderr. Então, agora, o fd 1 também aponta para / dev / stderr. -
2>some.file
- Alteramos o fd 2 para gravar no arquivo nomeado. Isso faz não alterar o que o fd 1 está usando atualmente.
Se tivéssemos de alterar a ordem dos redirecionamentos, obteríamos um resultado diferente:
$ sh -c 'echo stdout; echo stderr >&2' 2>some.file >&2
$ cat some.file
stdout
stderr
Porque nós mudamos fd 2 primeiro . Então redireciona o fd 1 para qualquer fd 2 que esteja atualmente usando .
Note que a minha terminologia está provavelmente errada ("aponte para", etc). É assim que me lembro como os redirecionamentos funcionam.