Em um script, verifique se a entrada padrão vem de um arquivo ou pipe

5

Eu sei que isso tem sido pobremente coberto anteriormente, mas essas respostas não têm explicação ou não se aplicam.

Basicamente, em algum momento, meus scripts precisam verificar se um arquivo está especificado, se foi usado posteriormente como entrada.

[ -f "$1" ] && TINPUT="$1"

simples o suficiente ... Agora, se um arquivo não foi encontrado, ou não especificado, eu teria TINPUT="-" , o que diria o comando mais tarde para ler stdin.

Aqui está a minha pergunta ... Como faço para que o script morra com erro, se ele foi executado sem um pipe ou sem um arquivo especificado?

Estou usando o dash, o shell compliant do Debian POSIX, então não posso usar o Bashisms. Eu também prefiro usar listas, acima de ifs , mas a maioria ifs poderia ser escrita em listas de qualquer maneira.

    
por J. M. Becker 04.06.2012 / 00:38

1 resposta

5

Você pode testar se a entrada padrão é um terminal:

if [ -n "$1" ]; then
  exec <"$1"
elif tty >/dev/null; then
  echo 1>&2 'Cowardly refusing to read data from a terminal.'
  exit 2
# else we're reading from a file or pipe
fi
    
por 04.06.2012 / 01:17