web-dev-qa-db-ja.com

スクリプトで、標準入力がファイルまたはパイプからのものかどうかを確認します

私はこれが以前に不十分にカバーされたことを知っていますが、それらの答えは説明が不足しているか、当てはまりません。

基本的に、ある時点で、スクリプトでファイルが指定されているかどうかを確認する必要があります。指定されている場合は、後で入力として使用されます。

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

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

これが私の質問です...パイプなしで、またはファイルを指定せずにスクリプトを実行した場合、スクリプトをエラーで終了させるにはどうすればよいですか?

Debian POSIX準拠のシェルであるdashを使用しているため、Bashismsを使用できません。また、ifsよりもリストを使用することを好みますが、ほとんどのifsはとにかくリストに書き込むことができます。

7
J. M. Becker

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

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