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.