Shell tahu empat jenis perintah.
- Alias: ini adalah nama panggilan untuk suatu perintah dengan beberapa opsi. Mereka didefinisikan dalam file inisialisasi shell (
~/.bashrcuntuk 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 (
cdmengubah direktori saat ini, setmengubah opsi dan parameter posisi, exportmengubah 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
PATHvariabel 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 aliasbawaan 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, setbuiltin mendaftar fungsi dengan definisi dan variabelnya. Dalam bash, ksh atau zsh, typeset -fdaftar 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 functionuntuk mendaftar perintah dari jenis tertentu. Anda bisa meneruskan string tambahan compgenke 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 PATHvariabel lingkungan tidak mengandung ~/dir-for-wat-command, compgen -ctidak 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.