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
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.
Tags shell stdin shell-script dash