posix posicionamento do redirecionamento de stdin (em cmd vs cmd in)

5

Eu sempre escrevo redirecionamento de stdin após o comando, porque para mim é mais natural ter primeiro o comando e depois os redirecionamentos (se houver):

some-command < input-file > output-file

Durante anos, vi pessoas escrevendo o redirecionamento de stdin antes do comando para ter alguma direção de fluxo:

< input-file some-command > output-file (or without spaces after < and > )

Esta ordenação é aceita pelo POSIX ou apenas aceita por muitos shells (no meu fedora 21 ela é aceita por bash , dash , tcsh , ksh e zsh )?

    
por Carlos Campderrós 18.08.2015 / 09:57

2 respostas

3

Esse comportamento foi definido por POSIX aqui :

If more than one redirection operator is specified with a command, the order of evaluation is from beginning to end.

e aqui :

A "simple command" is a sequence of optional variable assignments and redirections, in any sequence, optionally followed by words and redirections, terminated by a control operator.

Este já era o caso do Bourne shell , que POSIX usou como base.

Before a command is executed its input and output may be redirected using a special notation interpreted by the shell. The following may appear anywhere in a simple- command or may precede or follow a command and are not passed on to the invoked command. (…)

Ao contrário do shell Bourne original, o POSIX não permite que o redirecionamento preceda um comando complexo como while … done , ( … ) , etc.

Uma nota que a ordem de redirecionamento é importante, porque controla o comportamento do comando e impede que você obtenha algum resultado estranho em caso de falha. Exemplo:

command <input >output

se command não leu input (devido a permissão, inexistente ...) então será encerrado sem criar o arquivo vazio output se você trocar a posição de redirecionamento:

command >output <input
    
por 18.08.2015 / 10:00
0

Hmm, parece que bash ainda falha na notação de prefixo, portanto

$ < /etc/passwd while read line; do echo $line; done
bash: syntax error near unexpected token 'do'

enquanto zsh permite esse redirecionamento antes do loop while .

    
por 18.08.2015 / 16:36