Dans un script, vérifiez si l'input standard provient d'un file ou d'une pipe

Je sais que cela a été mal couvert auparavant, mais ces réponses manquent d'explication ou ne s'appliquent pas.

Fondamentalement, à un certain moment mes scripts ont besoin de vérifier si un file est spécifié, si c'était il sera utilisé plus tard comme input.

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

assez simple … Maintenant, si un file n'a pas été trouvé, ou non spécifié, j'aurais TINPUT="-" qui dirait à la command ultérieure de lire stdin.

Voici ma question … Comment puis-je get le script à mourir avec l'erreur, si elle a été exécutée sans un tuyau ou sans un file spécifié?

J'utilise dash, le shell Debian POSIX, donc je ne peux pas utiliser Bashisms. Je préfère aussi utiliser des lists, plutôt que des ifs mais la plupart des ifs peuvent être écrits dans des lists de toute façon.

Vous pouvez tester si l'input standard est un 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