Shell tahu empat jenis perintah.
- Alias: ini adalah nama panggilan untuk suatu perintah dengan beberapa opsi. Mereka didefinisikan dalam file inisialisasi shell (
~/.bashrc
untuk bash).
- Fungsi: mereka adalah potongan kode shell yang diberi nama. Seperti alias, mereka didefinisikan dalam file inisialisasi shell.
- Builtins: shell dilengkapi dengan sejumlah kecil perintah built-in. Kebanyakan bawaan memanipulasi keadaan shell (
cd
mengubah direktori saat ini, set
mengubah opsi dan parameter posisi, export
mengubah lingkungan, ...). Sebagian besar shell menawarkan builtin yang sama, tetapi setiap shell memiliki beberapa ekstensi untuk set dasar.
- Perintah eksternal: mereka tidak tergantung pada shell. Seperti program lain, shell mengeksekusi program eksternal dengan mencari mereka di jalur pencarian yang dapat dieksekusi . The
PATH
variabel lingkungan berisi daftar dipisahkan oleh titik dua direktori untuk mencari program.
Jika ada perintah dari beberapa jenis dengan nama yang sama, pertandingan pertama dalam urutan di atas dijalankan¹.
Anda dapat melihat jenis perintah yang sesuai dengan nama dengan menjalankan type some_name
.
Anda dapat mendaftar alias dengan menjalankan alias
bawaan tanpa argumen. Tidak ada cara untuk membuat daftar fungsi atau bawaan yang bekerja di semua shell. Anda dapat menemukan daftar bawaan dalam dokumentasi shell.
Dalam bash, set
builtin mendaftar fungsi dengan definisi dan variabelnya. Dalam bash, ksh atau zsh, typeset -f
daftar fungsi dengan definisinya. Di bash, Anda dapat mendaftar semua nama perintah dengan jenis apa pun compgen -c
. Anda dapat menggunakan compgen -A alias
, compgen -A builtin
compgen -A function
untuk mendaftar perintah dari jenis tertentu. Anda bisa meneruskan string tambahan compgen
ke daftar hanya perintah yang dimulai dengan awalan itu.
Dalam zsh, Anda bisa daftar perintah yang tersedia saat ini dari jenis tertentu dengan echo ${(k)aliases}
, echo ${(k)functions}
, echo ${(k)builtins}
dan echo ${(k)commands}
(bahwa salah satu daftar terakhir perintah eksternal saja).
Cuplikan agnostik shell berikut mencantumkan semua program eksternal yang tersedia:
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
Ada kasus tepi di Bash: perintah hash.
Manual Referensi Bash mengatakan:
Pencarian penuh direktori di $ PATH dilakukan hanya jika perintah tidak ditemukan di tabel hash
Mencoba:
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
The PATH
variabel lingkungan tidak mengandung ~/dir-for-wat-command
, compgen -c
tidak menunjukkan wat
, tapi Anda dapat menjalankan wat
.
Jika Anda ingin membayangi perintah yang ada, tentukan alias atau fungsi .
¹ Pengecualian: beberapa bawaan (disebut bawaan khusus ) tidak dapat dibayangi oleh suatu fungsi - bash dan zsh tidak mematuhi POSIX pada titik itu dalam mode standarnya.