Оболонка знає чотири види команд.
- Псевдоніми: це прізвиська для команди з деякими параметрами. Вони визначені у файлі ініціалізації оболонки (
~/.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 на той момент в їх режимі по замовчуванням , хоча.