スクリプトで標準入力がファイルまたはパイプから出ていることを確認してください。

スクリプトで標準入力がファイルまたはパイプから出ていることを確認してください。

私はこれがすでにあることを知っています。悪い以前は取り上げましたが、回答に説明がないか適用されませんでした。

デフォルトでは、ある時点で、私のスクリプトはファイルが指定されていることを確認する必要があり、指定された場合は後で入力として使用されます。

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

十分簡単です。これでTINPUT="-"、ファイルが見つからないか指定されていない場合は、標準入力を読み取るように次のコマンドに指示します。

私の質問は次のとおりです。パイプや指定されたファイルなしでスクリプトを実行するときにエラーが発生したときにスクリプトを終了させるにはどうすればよいですか?

私はDebian POSIX互換シェルであるdashを使っているので、Bashismを使うことはできません。私もリストの使用を好みますifsが、ほとんどはifsリストで書くことができます。

答え1

標準入力が端末かどうかをテストできます。

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

関連情報