Оболочка знает четыре вида команд.
- Псевдонимы: это псевдонимы для команды с некоторыми опциями. Они определены в файле инициализации оболочки (
~/.bashrc
для bash).
- Функции: они представляют собой фрагменты кода оболочки с указанным именем. Как и псевдонимы, они определены в файле инициализации оболочки.
- Встроенные функции: оболочка поставляется с небольшим количеством встроенных команд. Большинство встроенных функций манипулируют состоянием оболочки (
cd
изменяет текущий каталог, set
изменяет параметры и позиционные параметры, export
изменяет среду,…). Большинство оболочек предлагают в основном те же встроенные функции, но каждая оболочка имеет несколько расширений базового набора.
- Внешние команды: они не зависят от оболочки. Как и другие программы, оболочка выполняет внешние программы, просматривая их в пути поиска исполняемого файла .
PATH
Переменная среды содержит разделенный двоеточиями список каталогов для поиска программ.
Если есть команды нескольких типов с одинаковыми именами, выполняется первое совпадение в указанном выше порядке¹.
Вы можете увидеть, какому типу команды соответствует имя, запустив type some_name
.
Вы можете перечислить псевдонимы, запустив alias
встроенный без аргумента. Нет способа перечислить функции или встроенные функции, которые работают во всех оболочках. Вы можете найти список встроенных функций в документации оболочки.
В bash set
встроенные функции перечисляют функции с их определениями, а также переменными. В bash, ksh или zsh, typeset -f
перечисляет функции с их определениями. В bash вы можете перечислить все имена команд любого типа с помощью compgen -c
. Вы можете использовать compgen -A alias
, compgen -A builtin
compgen -A function
чтобы получить список команд определенного типа. Вы можете передать дополнительную строку, чтобы compgen
перечислить только команды, которые начинаются с этого префикса.
В Zsh, вы можете получить список доступных в данный момент команд данного типа с echo ${(k)aliases}
, echo ${(k)functions}
, echo ${(k)builtins}
и echo ${(k)commands}
(только что последними списками внешних команд).
В следующем фрагменте, не зависящем от оболочки, перечислены все доступные внешние программы:
case "$PATH" in
(*[!:]:) PATH="$PATH:" ;;
esac
set -f; IFS=:
for dir in $PATH; do
set +f
[ -z "$dir" ] && dir="."
for file in "$dir"/*; do
if [ -x "$file" ] && ! [ -d "$file" ]; then
printf '%s = %s\n' "${file##*/}" "$file"
fi
done
done
В Bash: есть хэшированные команды.
Справочное руководство Bash гласит:
Полный поиск в каталогах в $ PATH выполняется, только если команда не найдена в хеш-таблице
Пытаться:
set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat
PATH
Переменная среды не содержит ~/dir-for-wat-command
, compgen -c
не показывает wat
, но вы можете запустить wat
.
Если вы хотите скрыть существующую команду, определите псевдоним или функцию .
¹ Исключение: некоторые встроенные функции (называемые специальными встроенными ) не могут быть скрыты какой-либо функцией - хотя bash и zsh не соответствуют POSIX в этой точке в режиме по умолчанию.