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

Я могу высказать Вам хорошее предположение... это - вероятно, функция поиска в GNOME. Большинство средств поиска с открытым исходным кодом должно контролировать файлы для действия. В Linux это очень эффективно, но в BSD нет никакого inotify. Они используют kqueue, который является большим за исключением того, что он израсходовал все Ваши дескрипторы файлов. Можно увеличить предел или поворот функций поиска/контроля. Существуют несколько, и это можно было бы назвать гончей.

4
05.02.2013, 17:36
2 ответа

Если Вы знаете, что никогда не собираетесь использовать 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
4
27.01.2020, 20:54

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

1
27.01.2020, 20:54
  • 1
    хорошо, вводя по абсолютному адресу вокруг немного с lsof кажется, что нет никакого общего пути. Однако оболочки как zsh знайте параметры командной строки для grep и таким образом мог обнаружить, если аргумент файла отсутствует. –  Michael Kuhn 05.02.2013, 17:28
  • 2
    zshфункция завершения для grep знает аргументы, которые это ожидает, но я сомневаюсь, что это встроено в оболочку по сути. Так или иначе, как это знало бы, намереваетесь ли Вы вводить/копировать текст к stdin сами? –  Kevin 05.02.2013, 17:43
  • 3
    я хотел бы, чтобы это предупредило меня, не бросило ошибку. При редком обстоятельстве, где я хочу вставить что-то в, предупреждение не вредит. –  Michael Kuhn 05.02.2013, 18:38
  • 4
    Вы хотели бы, чтобы это предупредило Вас на основе какой условия? Если можно перечислить конкретные условия, можно перенести его в функцию, как stephane предполагает, иначе ни оболочка, ни grep не могут прочитать мысли. –  Kevin 05.02.2013, 18:54
  • 5
    проблемой не является одно из решения проблемы остановки. Концептуально, не было бы ничего предотвращающего "символ чтения от терминального" кода от использования некоторого метода внеполосной сигнализации для уведомления терминала, когда это ожидает и когда это по крайней мере временно пресыщено. Выполнение, которое могло бы потребовать исправления нескольких мест в ОС, но это будет и возможно и полезно (я не уверен, было ли достаточно полезно выровнять по ширине усилие, но это будет, конечно, казаться разумным). –  supercat 25.04.2014, 22:33

Теги

Похожие вопросы