Se você é um programador C, você pode pensar em &1
como "o endereço de 1", então 2>&1
lê "descritor de arquivo de redirecionamento # 2 para o mesmo lugar que # 1".
Você tem um mnemônico ou sistema? Isso me incomoda há anos, eu sempre tenho que procurá-lo
"Dois para e um" ("to" sendo >
) faz mais sentido lógico para mim do que "Two and to one", que é o que eu normalmente poderia confundir. Se você considera "e um" como um único substantivo (um lugar), também faz sentido gramatical no contexto, o que é mais difícil de fazer com "Dois e um" - você teria que considerar "para um" um único substantivo, e ainda não faria sentido contextual.
Não é um mnemônico, mas eu o li da seguinte forma:
0
é stdin.
1
é stdout.
2
é stderr.
>
está em.
<
está fora de.
&
é descritor de arquivo (em alguns shells).
2>&1
2 > & 1
stderr into file descriptor 1
redirect stderr into stdout
Isso pode mudar se você tiver mexido com qualquer um dos descritores de arquivo antes do redirecionamento ...
2>somefile 1>&2
2 > somefile 1 > &2
stderr into somefile and stdout into file descriptor 2
redirect stderr into somefile and stdout into somefile.
Quando você escreve 2>&1
, está dizendo "erro padrão para a saída padrão".
Vamos quebrar isso.
Primeiro, você deseja memorizar que o erro padrão é 2
e a saída padrão é 1
.
Então você tem 2
algo algo 1
.
"vai para" está escrito >
.
Então você tem 2>
something 1
.
2>filename
significa enviar erro padrão para filename
. Mas você não quer enviá-lo para um arquivo chamado 1
. Você quer outra coisa: o número de um arquivo que já está aberto. É para isso que o &
é.
Então 2>&1
.
Você também pode pensar nisso como se estivesse fazendo uma atribuição, em que >
é igual a um igual e &
é como $
, compare:
f=$1
2>&1
Para entender uma linha de comando com vários redirecionamentos, o importante é saber que os redirecionamentos são feitos da esquerda para a direita. Consulte Ordem dos redirecionamentos para obter mais detalhes sobre isso.
Eu lembrei que é sempre 2 - > 1. Stderr para stdout.
A parte do meio é sempre a mais difícil e eu sempre estraguei tudo, até que me lembrei que primeiro vem o caractere nítido >
, então o personagem que não consigo escrever na vida real &
.
Portanto, nunca 2&>1
, sempre 2>&1
Se você entende que FD2 é STDERR, você pode pensar: "Ah, e capturar STDERR onde quer que eu envie STDOUT (FD1)".
Meus colegas de trabalho e eu geralmente dizemos "dois é maior que um", porque a maioria de nós nem sempre lembra que stderr
é descritor de arquivo 2
e stdout
é 1
(especialmente os novos no unix / linux), então os outros mnemônicos sobre redirecionamento de stderr
não funcionam realmente. O único problema é que você ainda precisa se lembrar de onde o e comercial vai!
Tags io-redirection