Оболонка знає чотири види команд.
- Псевдоніми: це прізвиська для команди з деякими параметрами. Вони визначені у файлі ініціалізації оболонки (
~/.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 є крайній випадок: хеш-команди.
Посібник Баша говорить:
Повний пошук каталогів у $ 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.
Якщо ви хочете затінити існуючу команду, визначте псевдонім або функцію .
¹ Виняток: кілька вбудовані команди ( так звані спеціальні вбудовані команди ) не можуть бути затьмарені функції - баш і ЗШ не відповідають стандарту POSIX на той момент в їх режимі по замовчуванням , хоча.