Entrada do arquivo: “avançada” (usando sinal menor que) vs. sintaxe “iniciante”

2

Eu li o seguinte no grymoire :

A simple example is changing "day" in the "old" file to "night" in the "new" file:

sed s/day/night/ <old >new

Or another way (for UNIX beginners),

sed s/day/night/ old >new

Por que o autor considera o primeiro formulário mais avançado?

Quero dizer, quais são as vantagens de usar este formulário sobre a sintaxe do "iniciante"?

    
por bli 27.11.2015 / 17:34

2 respostas

7

Uma vantagem em permitir que o shell faça o open() como:

utility <in >out

ao invés de permitir que o utilitário nomeado execute o open() como:

utility in >out

... é que o descritor de arquivo é protegido antes que o utilitário nomeado seja chamado, ou caso ocorra um erro durante o open() , o utilitário nunca é chamado. Essa é a melhor maneira de evitar efeitos colaterais de possíveis condições de corrida - como pode acontecer de tempos em tempos quando se trabalha com streams e o editor de stream .

Se um redirecionamento falhar, o shell interrompe a chamada para o utilitário e grava uma mensagem de erro para stderr - o stderr do shell e não o que você possa ter direcionado temporariamente para o utilitário < em> (bem, isso depende da ordem de linha de comando dos redirecionamentos também) - em um formato de diagnóstico padrão. A maneira mais simples de testar se você pode abrir um arquivo é abri-lo, e < faz isso implicitamente antes de qualquer outra coisa.

Provavelmente, a condição de corrida mais óbvia indicada nos comandos em sua pergunta envolve o redirecionamento out . Em ambos os formulários, o shell também faz o > escrever aberto e isso acontece independentemente de o sed poder abrir com êxito o readfile no segundo formulário. Então out fica truncado - e possivelmente desnecessariamente. Isso pode ser ruim se você quiser apenas escrever sua saída se conseguir abrir sua entrada com sucesso. Isso não é um problema, no entanto, se você sempre abrir sua entrada primeiro, como é feito no primeiro formulário.

Caso contrário, há pelo menos 10 descritores de arquivos numericamente referenciados que podem ser manipulados com a sintaxe de redirecionamento de shell dessa forma, e essas combinações podem ficar meio que cabeludas.

Além disso, quando o shell faz a abertura, o descritor não pertence ao comando chamado - como acontece com a segunda versão -, mas ao shell, e o comando chamado apenas o herda. Ele herda da mesma forma que qualquer outro comando chamado no mesmo comando composto e, portanto, os comandos podem compartilhar a entrada dessa maneira.

    
por 27.11.2015 / 17:43
1

sed recebe arquivo (s) para trabalhar via STDIN e como argumento (s).

No primeiro formulário, sed s/day/night/ <old , você está usando o operador de redirecionamento de entrada para passar o conteúdo do arquivo old para sed via STDIN.

No segundo formulário, sed s/day/night/ old , você está apenas passando o nome do arquivo como um argumento para sed .

Ambos estão corretos e produzirão o mesmo resultado.

Acho que o autor quis dizer que, a menos que você esteja familiarizado com os fluxos padrão e com o que eles fazem, como usar os operadores de redirecionamento corretamente, pode ser um pouco difícil para o novo usuário se acostumar com o primeiro, mas apenas minha opinião, não podemos ter certeza do que o autor está fazendo.

    
por 27.11.2015 / 17:42