Может ли оболочка предупредить меня, если программа ждет стандартного ввода?

Предположим, я хочу найти строку в большом файле: grep foo bar.txt | less grep foo bar.txt | less , но я на самом деле grep foobar.txt | less grep foobar.txt | less . Теперь grep ждет, когда я наберу что-нибудь на терминале. Похоже, что команда берет навсегда, пока я не замечаю свою ошибку.

Может ли оболочка (любая оболочка или, возможно, tmux) обнаруживать, что команда ожидает ввода консоли и предупреждает?

Изменить: Кажется, что каждый процесс имеет стандартный ввод, и оболочка не знает, действительно ли она ждет, когда что-то придет туда. Однако оболочки, такие как zsh знают аргументы командной строки для общих команд, таких как grep и поэтому могут предупредить меня о программах, которые он знает.

( grep f Tab ничего не пытается выполнить, grep foo b Tab попытается заполнить имя файла.)

Если вы знаете, что никогда не будете использовать grep для чтения с терминала, вы можете переопределить grep как:

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

Это не даст вам предупреждения о вашей опечатке. Но, по крайней мере, он немедленно вернется без матча. Это также повлияет на поведение, когда - или /dev/stdin передается как аргумент grep .

Редактировать:

На самом деле, способ получить предупреждение будет заключаться в том, чтобы закрыть stdin вместо перенаправления из /dev/null :

 grep() { if [ -t 0 ]; then <&- command grep "$@" else command grep "$@" fi } $ grep foobar.txt grep: (standard input): Bad file descriptor 

Нет, потому что оболочка не знает, блокирует ли программа вход. Даже если бы это было так, он не мог знать, придет ли вход в конечном итоге (см. Проблему остановки ). Что, если он ожидает ввода от терминала? Вы можете ждать минут, дней, десятилетий, чтобы дать вход, который он ждет. less происходит блокирование ввода от grep , но это не всегда так, например try cat | grep foo cat | grep foo – он обработает то, что вы набираете в командной строке ( Ctrl + D, чтобы закончить).