set
не просто встроенная функция, это специальная встроенная функция POSIX . Есть несколько встроенных команд, которые определены стандартами, чтобы их можно было найти в поиске команд раньше всего - $ PATH
не ищется, имена функций не ищутся и т. Д. Большинство встроенных команд not специальные на самом деле требуются по стандарту POSIX, чтобы их можно было найти в вашем $ PATH
до , оболочка запустит любую из своих собственных встроенных процедур.Это верно для echo
и большинства других (хотя соблюдение стандарта в этом отношении было предметом разногласий в списках рассылки открытых групп в прошлом) , но not of set
, trap
, break
, return
, continue
, .
, :
, раз
, eval
, выход
, экспорт
, только чтение
, отключено
или exec
.
Все это зарезервированные имена оболочки, и у них есть специальные атрибуты, отличные от их порядка предпочтения для поиска команд. Например, вы не можете определить функцию оболочки с любым из этих имен в совместимой со стандартами оболочке. Это хорошая вещь - она позволяет людям безопасно писать переносимые сценарии . Это базовые команды, с помощью которых опытный автор сценариев может создать безопасную и надежную точку опоры в своей среде. Вторжение в это пространство имен не рекомендуется .
Однако, если вы действительно хотите вторгнуться в него, вы можете сделать это переносимо с псевдонимом
. Порядок раскрытия оболочки позволяет этот обходной путь. Поскольку псевдоним
раскрывается во время чтения команды, то, что бы вы ни заменили имя набора на
в вашем определении, оно будет правильно расширяться, просто, вероятно, не должно расширяться до одного из этих имен.
Итак, вы можете сделать:
alias set=./set
... что будет работать нормально.
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
вполне резонно.