Powłoka zna cztery rodzaje poleceń.
- Aliasy: są to pseudonimy dla polecenia z pewnymi opcjami. Są zdefiniowane w pliku inicjującym powłoki (
~/.bashrc
dla bash).
- Funkcje: są to fragmenty kodu powłoki o nazwie. Podobnie jak aliasy, są one zdefiniowane w pliku inicjalizacji powłoki.
- Wbudowane: powłoka zawiera niewielką liczbę wbudowanych poleceń. Większość wbudowanych manipuluje stanem powłoki (
cd
zmienia bieżący katalog, set
zmienia opcje i parametry pozycyjne, export
zmienia środowisko,…). Większość powłok oferuje w dużej mierze te same wbudowane elementy, ale każda powłoka ma kilka rozszerzeń zestawu podstawowego.
- Polecenia zewnętrzne: są niezależne od powłoki. Podobnie jak inne programy, powłoka wykonuje programy zewnętrzne, wyszukując je w ścieżce wyszukiwania wykonywalnego .
PATH
Zmienna zawiera oddzieloną dwukropkami listę katalogów do wyszukiwania programów.
W przypadku poleceń kilku typów o tej samej nazwie, wykonywane jest pierwsze dopasowanie w powyższej kolejności¹.
Możesz zobaczyć, jaki typ polecenia odpowiada nazwie, uruchamiając type some_name
.
Możesz wyświetlić listę aliasów, uruchamiając alias
wbudowany bez argumentów. Nie ma sposobu, aby wyświetlić listę funkcji lub wbudowanych funkcji, które działają we wszystkich powłokach. Możesz znaleźć listę wbudowanych w dokumentacji powłoki.
W bash set
wbudowane listy funkcji z ich definicjami, a także zmiennymi. W bash, ksh lub zsh typeset -f
wyświetla funkcje z ich definicjami. W bash możesz wyświetlić listę wszystkich nazw poleceń dowolnego typu compgen -c
. Możesz użyć compgen -A alias
, compgen -A builtin
compgen -A function
aby wyświetlić listę poleceń określonego typu. Możesz przekazać dodatkowy ciąg znaków, aby compgen
wyświetlić tylko polecenia rozpoczynające się od tego prefiksu.
W zsh, można wymienić aktualnie dostępne polecenia danego typu z echo ${(k)aliases}
, echo ${(k)functions}
, echo ${(k)builtins}
i echo ${(k)commands}
(ten ostatni wymienia tylko poleceń zewnętrznych).
Poniższy fragment kodu niezależny od powłoki zawiera listę wszystkich dostępnych programów zewnętrznych:
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
W poleceniach Bash: hashed występuje wielkość liter.
Bash Reference Manual mówi:
Pełne wyszukiwanie katalogów w $ PATH jest wykonywane tylko wtedy, gdy polecenia nie znaleziono w tabeli skrótów
Próbować:
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
Zmienna nie zawiera ~/dir-for-wat-command
, compgen -c
nie pokazuje wat
, ale można uruchomić wat
.
Jeśli chcesz ukryć istniejące polecenie, zdefiniuj alias lub funkcję .
¹ Wyjątek: kilka wbudowanych funkcji (zwanych wbudowanymi specjalnymi ) nie może być przesłanianych przez funkcję - jednak bash i zsh nie są zgodne z POSIX w tym punkcie w trybie domyślnym.