文字列を見つけるために大きなファイルを検索したいのですが、grep foo bar.txt | less
実際にはを入力するとしましょうgrep foobar.txt | less
。今grep
端末に何かを入力するのを待っています。私のエラーが見つかるまでこのコマンドは続いたようです。
シェル(すべてのシェルまたはtmux)がコマンドがコンソール入力を待っていることを検出して警告できますか?
編集する:すべてのプロセスには標準入力があるように見え、シェルは実際に何かが到着するのを待っているかどうかはわかりません。しかし、シェルはzsh
一般的なコマンドのコマンドライン引数を知っているので、あなたがgrep
知っているプログラムについて私に警告することができます。
(grep f
Tab何も完成しようとせずにgrep foo b
Tabファイル名を完成しようとします。)
答え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