標準入力から入力がないときに入力を停止する「読み取り」コマンドを避けてください。

標準入力から入力がないときに入力を停止する「読み取り」コマンドを避けてください。

コマンドラインから入力を受け取る関数があります。オプションで、標準入力から。ただし、入力ストリームが指定されていない場合は入力を停止します。

#!/bin/bash
somefunc() {
  # output strings on command line.
  while (($#)); do
    echo "$1"
    shift
  done

  # take input from stdin, if it exists.
  declare line
  while read -sr line; do 
    echo "$line"
  done
}

somefunc "$@"

これは働きます:

$ somefunc "arg1" "arg2" "..." <"/some/file"

以下は行われません。

$ somefunc "arg1" "arg2" "..." 

読み取りコマンドにタイムアウト(例:-t 0.0001)を使用してこの問題を解決できますが、これは少しぎこちなく脆弱です。

タイムアウトを使用せずにこれを達成するより良い方法はありますか?

答え1

-t を使用した bash 組み込みテストでは、作業をうまく実行する必要があります。 [ -t 0 ] このリンクには良い例があります。

入力がパラメータ、ファイル、または端末から来ているかどうかを検出する方法

答え2

2つの解決策があり、どちらも同じように速くて不器用です。

これが私が好む解決策です。

  # take input from stdin, if it exists.
  if read -t 0; then
    declare line
    while read -sr line; do 
      echo "$line"
    done
  fi

[ -t 0 ] も動作します:

  # take input from stdin, if it exists.
  if [ -t 0 ]; then
    declare line
    while read -sr line; do 
      echo "$line"
    done
  fi

答え3

< /dev/nullおそらく、保留中のコマンドの最後に追加した場合でしょう。

これは、標準入力を中断することなくコマンドを続行できるように、コマンドへの仮想入力を提供します。

関連情報