プログラムが標準入力を待っている場合、シェルは私に警告できますか?

プログラムが標準入力を待っている場合、シェルは私に警告できますか?

文字列を見つけるために大きなファイルを検索したいのですが、grep foo bar.txt | less実際にはを入力するとしましょうgrep foobar.txt | less。今grep端末に何かを入力するのを待っています。私のエラーが見つかるまでこのコマンドは続いたようです。

シェル(すべてのシェルまたはtmux)がコマンドがコンソール入力を待っていることを検出して警告できますか?

編集する:すべてのプロセスには標準入力があるように見え、シェルは実際に何かが到着するのを待っているかどうかはわかりません。しかし、シェルはzsh一般的なコマンドのコマンドライン引数を知っているので、あなたがgrep知っているプログラムについて私に警告することができます。

grep fTab何も完成しようとせずにgrep foo bTabファイル名を完成しようとします。)

答え1

grep端末からデータを読み取ることを決して使用しないことがわかっている場合は、grepを次のようにオーバーライドできます。

grep() {
  if [ -t 0 ]; then
    < /dev/null command grep "$@"
  else
    command grep "$@"
  fi
}

タイプミスに関する警告は提供されません。ただし、少なくとも一致するものがなくてもすぐに返されます。また、またはが-パラメータ/dev/stdinとして渡されるときの動作にも影響しますgrep

編集する:

実際に警告を受ける1つの方法は、標準入力を次からリダイレクトするのではなく閉じることです/dev/null

grep() {
  if [ -t 0 ]; then
    <&- command grep "$@"
  else
    command grep "$@"
  fi
}

$ grep foobar.txt
grep: (standard input): Bad file descriptor

答え2

いいえ、シェルはプログラムが入力をブロックしているかどうかを知らないためです。それにもかかわらず、最終的に入力が来るかどうかを知る方法はありません(参照:ダウンタイムの問題)。端末からの入力が予想されるとどうなりますか?待っている入力を提供するまで、数分、数日、数十年を待つことができます。less入力が到着するのを防ぐために発生しますgrepが、必ずしもそうではありません。 tryのようにコマンドラインに入力した内容(+完了)cat | grep fooを処理します。CtrlD

関連情報