Redirecionando a saída padrão e o erro padrão para um arquivo [duplicado]

1

Eu entendi que temos dois métodos de redirecionar stdout e stderr para o mesmo arquivo. O primeiro método é: %código% Como o autor do este livro declara: Usando este método, realizamos 2 redirecionamentos, primeiro redirecionamos o stdout para o ls-output.txt e então redirecionamos o stderr (descritor de arquivo 2) para stdout (usando o descritor de arquivo 1).

A ordem dos redirecionamentos é importante.

ls -l /bin > ls-output.txt 2>&1 redirecionaria o stderr para a tela.

Minha pergunta é: Como em muitas linguagens de programação, o comando foi projetado com algumas regras de associação e precedência em mente e como lemos o comando enquanto o escrevemos na tela? e qual é a sequência da execução backend do comando?

Aqui está o que eu penso sobre a seqüência de execução: Primeiro, o comando ls -l /bin 2>&1 >ls-output.txt envia sua saída para stdout e error para stderr (qualquer um deles). Em seguida, o stderr é redirecionado para stdout (se houver algum erro, por exemplo: se ls -l /bin for usado) Agora, o fluxo stdout contém um dos dois (saída ou erro) que ele redireciona para o arquivo ls-output.txt

    
por Aman 05.01.2015 / 13:40

1 resposta

3

Os redirecionamentos são processados da esquerda para a direita. Quando você executa:

ls -l /bin >ls-output.txt 2>&1

o shell realiza aproximadamente as seguintes operações internamente:

fork(); // Then in the child process:
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);
// 2>&1
dup2(1, 2);

Em seguida, ele executa o comando ls -l /bin com esses anexos de descritor no lugar. Como você redireciona stdout para o arquivo primeiro, o redirecionamento de stderr herda esse redirecionamento.

Se você fosse escrever

ls -l /bin 2>&1 >ls-output.txt

A ordem das operações seria invertida:

// 2>&1
dup2(1, 2);
// >ls-output.txt
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);

Isso conecta stderr ao original stdout , que provavelmente será o terminal. Em seguida, ele redireciona stdout para um arquivo; isso não tem efeito em stderr .

    
por 05.01.2015 / 22:59