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

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

文字列を見つけるために大きなファイルを検索したいのですが、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

おすすめ記事