APT --fix-Brade Install Sub-процесс

set не просто встроенная функция, это специальная встроенная функция POSIX . Есть несколько встроенных команд, которые определены стандартами, чтобы их можно было найти в поиске команд раньше всего - $ PATH не ищется, имена функций не ищутся и т. Д. Большинство встроенных команд not специальные на самом деле требуются по стандарту POSIX, чтобы их можно было найти в вашем $ PATH до , оболочка запустит любую из своих собственных встроенных процедур.Это верно для echo и большинства других (хотя соблюдение стандарта в этом отношении было предметом разногласий в списках рассылки открытых групп в прошлом) , но not of set , trap , break , return , continue , . , : , раз , eval , выход , экспорт , только чтение , отключено или exec .

Все это зарезервированные имена оболочки, и у них есть специальные атрибуты, отличные от их порядка предпочтения для поиска команд. Например, вы не можете определить функцию оболочки с любым из этих имен в совместимой со стандартами оболочке. Это хорошая вещь - она ​​позволяет людям безопасно писать переносимые сценарии . Это базовые команды, с помощью которых опытный автор сценариев может создать безопасную и надежную точку опоры в своей среде. Вторжение в это пространство имен не рекомендуется .

Однако, если вы действительно хотите вторгнуться в него, вы можете сделать это переносимо с псевдонимом . Порядок раскрытия оболочки позволяет этот обходной путь. Поскольку псевдоним раскрывается во время чтения команды, то, что бы вы ни заменили имя набора на в вашем определении, оно будет правильно расширяться, просто, вероятно, не должно расширяться до одного из этих имен.

Итак, вы можете сделать:

alias set=./set

... что будет работать нормально.

-1
11.07.2018, 17:46
1 ответ

GNU grep, а также некоторые другие реализации grep, имеют не -стандарт -Rопция, которая заставляет его искать заданные файлы и каталоги рекурсивно.

Реализация GNU grepнеявно использует текущий каталог если в командной строке не указан другой файл или каталог, когда -Rиспользуется.

grep -R PATTERN
Таким образом,

совпадает с

grep -R PATTERN.

Это было бы то же самое, что и grep -R PATTERN *, если бы не было скрытого файлы в текущем каталоге, или если была выбрана опция оболочки dotglob. устанавливается в bash. Без установки параметра оболочки dotglobв bash, шаблон *в командной строке будет расширяться только до не -скрытых имен.

Другие grepреализации не используют .неявно с -Rдаже если это может показаться разумным значением по умолчанию, так как рекурсивный поиск стандартный ввод имеет мало смысла.

Это grepв OpenBSD, например:

$ grep -R PATTERN
grep: warning: recursive search of stdin

Запуск grepбез -Rи без входных файлов сделает утилита чтения стандартного ввода. Все реализации grepделают это так: это то, что POSIX говорит, что утилита должна делать .

Таким образом, запуск (вполне корректной )команды

grep PATTERN

без входных файлов заставит grepожидать ввода с терминала. Он будет ждать ввода, пока вы не просигнализируете об окончании ввода, используя Ctrl+D или прервать процесс с помощью Ctrl+C .

Чтение из стандартного потока ввода и рекурсивный поиск совпадающие шаблоны в структуре каталогов являются взаимоисключающими операции. Было бы мало смысла делать

somecommand | grep -R PATTERN

тогда как

somecommand | grep PATTERN

вполне резонно.

4
28.01.2020, 05:07

Теги

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