Оболочка знает четыре вида команд.
- Псевдонимы: это псевдонимы для команды с некоторыми опциями. Они определены в файле инициализации оболочки (
~/.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 в этой точке в режиме по умолчанию.