Como você se lembra da sintaxe do redirecionamento 2 & 1 [closed]?

12

Você tem um mnemônico ou sistema? Isso me incomoda há anos, eu sempre tenho que procurá-lo

    
por zzapper 19.06.2014 / 16:01

7 respostas

19

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".

    
por 19.06.2014 / 16:04
3

"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.

    
por 19.06.2014 / 16:08
2

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. 
    
por 19.06.2014 / 16:45
2

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.

    
por 19.06.2014 / 16:33
0

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

    
por 19.06.2014 / 16:13
0

Se você entende que FD2 é STDERR, você pode pensar: "Ah, e capturar STDERR onde quer que eu envie STDOUT (FD1)".

    
por 19.06.2014 / 16:13
0

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!

    
por 19.06.2014 / 19:12