Perintah type Bash: mengenali jenis dan lokasi perintah

type adalah perintah bawaan di Bash yang menunjukkan apakah nama perintah yang Anda masukkan ditafsirkan sebagai alias, kata khusus, fungsi, perintah built-in, atau file eksekusi. Ini berguna untuk menemukan penyebab ketika nama yang sama ada dalam beberapa bentuk atau program yang tidak terduga dijalankan.

Sementara which terutama berfokus pada menemukan file yang dapat dieksekusi di PATH, type menjelaskan resolusi perintah yang sebenarnya, termasuk alias dan fungsi di shell saat ini. Ini adalah perintah yang baik untuk digunakan pertama kali saat mendiagnosis lingkungan Bash.

Apa itu perintah type?

Sebelum mengeksekusi nama perintah, shell mencari alias, fungsi, perintah bawaan, dan file yang dapat dieksekusi di PATH menurut aturan tertentu. type memberi tahu Anda apa yang saat ini dianggap Bash sebagai nama itu dan apa yang akan dijalankannya.

type itu sendiri adalah perintah bawaan Bash. Shell lain memiliki perintah serupa, tetapi opsi dan format output mungkin berbeda, jadi contoh dalam artikel ini berdasarkan Bash.

Sintaks dasar dan tipe hasil

Kurung siku menunjukkan opsi, bukan teks yang harus diketik. Berikan setidaknya satu nama.

type [-afptP] name...

Anda dapat menentukan satu atau lebih nama perintah.

type ls
type cd
type if
type printf

Keluaran default adalah kalimat yang dapat dibaca oleh manusia. Tergantung pada pengaturan lingkungan Anda, tipe berikut dapat muncul.

Tipe Arti
alias Alias shell yang diperluas saat Bash membaca perintah, jika perluasan alias berlaku.
keyword Kata-kata khusus shell seperti if dan for.
function Fungsi yang didefinisikan di shell saat ini.
builtin Perintah bawaan yang termasuk dalam Bash itu sendiri.
file File eksekusi eksternal ditemukan melalui pencarian PATH.

Periksa semua kandidat dengan nama yang sama

-a mencetak semua lokasi yang sesuai dengan nama, termasuk alias, fungsi, perintah bawaan, dan file eksekusi yang ditemukan di PATH.

type -a printf
type -a test
type -a ls

printf dapat ada sebagai perintah bawaan Bash maupun file eksekusi eksternal. type printf dasar hanya menampilkan opsi pertama yang akan dipilih, tetapi -a berguna untuk memeriksa kandidat yang tersembunyi.

Opsi untuk memilih format keluaran

Cetak hanya tipe dengan -t

-t menghasilkan salah satu dari alias, keyword, function, builtin, atau file alih-alih kalimat deskriptif. Jika nama tidak ditemukan, tidak ada yang dihasilkan dan mengembalikan status gagal.

type -t cd
type -t if
type -t ls

Cetak jalur executable dengan -p dan -P

-p mencetak jalur executable jika nama ditafsirkan sebagai file eksternal. Tidak ada keluaran jika alias, fungsi, atau perintah bawaan dipilih terlebih dahulu; status sukses saja tidak memastikan jalur dicetak.

type -p ls
type -p cd

-P memaksa pencarian PATH untuk menemukan kandidat executable meskipun nama saat ini adalah alias atau perintah bawaan.

type -P printf
type -P test

Jika Bash memiliki jalur hash yang diingat, -p dan -P dapat menampilkan jalur yang disimpan yang berbeda dari entri pertama di PATH saat ini. Jika ragu, bersihkan hash dengan hash -r dan periksa lagi.

Ringkasan opsi tipe

Opsi Deskripsi
-a Cetak semua kandidat yang cocok dengan nama.
-f Lewati pencarian fungsi shell, baik dengan maupun tanpa -a.
-p Cetak jalur ketika hasil interpretasi default adalah executable eksternal.
-P Temukan executable di PATH dengan prioritas dibandingkan tipe lain.
-t Cetak jenis perintah sebagai satu kata.

Ketika perintah berbeda karena alias dan fungsi

Memeriksa Alias

Dalam shell interaktif, opsi yang sering digunakan dapat disertakan dalam alias.

type ls
alias ls

Garis miring terbalik mencegah perluasan alias, tetapi fungsi shell dengan nama yang sama masih dapat berjalan. Jalur absolut melewati pencarian nama; pastikan jalurnya ada di sistem Anda.

\ls
/usr/bin/ls

Memeriksa Definisi Fungsi

Jika fungsi shell didefinisikan dengan nama yang sama seperti perintah eksternal, fungsi tersebut mungkin dijalankan terlebih dahulu. Output default dari type dapat menampilkan definisi fungsi.

type deploy
type -t deploy

Di dalam fungsi, command name melewati pencarian fungsi. Namun, perintah bawaan dengan nama tersebut masih dapat dipilih; gunakan jalur absolut bila perlu menjalankan file eksternal tertentu.

Perbandingan type, command -v dan which

Metode Fitur
type name Ini menjelaskan alias, kata khusus, fungsi, perintah bawaan, dan file di Bash secara rinci.
type -a name Memeriksa semua kandidat yang mungkin dengan nama yang sama.
command -v name Relatif portabel untuk memeriksa keberadaan perintah dan resolusi dalam skrip shell.
which name Tergantung pada implementasi, ini terutama menemukan file yang dapat dieksekusi dalam PATH dan mungkin tidak mencerminkan fungsi shell atau alias secara akurat.

Untuk diagnostik interaktif di Bash, type umumnya cocok, dan untuk memeriksa keberadaan perintah dalam skrip shell POSIX, command -v biasanya tepat.

Menggunakan dengan aman dalam skrip shell

Bercabang berdasarkan jenis perintah

Simpan contoh ini sebagai cek-type.sh lalu jalankan bash cek-type.sh printf. Pemeriksaan dilakukan pada proses Bash yang menjalankan skrip, sehingga alias atau fungsi di shell interaktif belum tentu tersedia di sana.

kind=$(type -t "$1") || {
 printf 'Perintah tidak ditemukan: %s\n' "$1" >&2
 exit 1
}

case $kind in
 alias|function|builtin|file|keyword)
 printf '%s: %s\n' "$1" "$kind";;
esac

Contoh ini bergantung pada keluaran type -t Bash, jadi pastikan interpreter skrip adalah Bash.

Gunakan status keluar alih-alih pernyataan keluaran

Keluaran default dapat bervariasi tergantung versi atau lokasi. Untuk memeriksa hanya keberadaan perintah, jangan parsing string hasil; periksa status keluarnya.

if type git >/dev/null 2>&1; then
 printf '%s\n' 'git tersedia.'
fi

Pertanyaan yang Sering Diajukan

type -p tidak mengeluarkan apa pun

Nama tersebut mungkin pertama kali ditafsirkan sebagai alias, fungsi, atau perintah bawaan, atau mungkin tidak ada executable eksternal. Gunakan type -a name untuk melihat semua kandidat, dan gunakan type -P name untuk memaksa pencarian hanya pada file eksternal.

Setelah mengubah PATH, path sebelumnya muncul

Penetapan ulang PATH pada Bash mengosongkan tabel hash. Jika hasil lama tetap muncul, periksa apakah PATH diubah pada shell yang sama, lalu periksa tabel hash dan lingkungan aktual. Perintah hash -r menghapus semua entri yang diingat di shell saat ini; ganti command pada contoh dengan nama yang ingin diperiksa.

hash
hash -r
type -P command

Alias tidak terlihat di skrip.

Dalam Bash non-interaktif, perluasan alias tidak diaktifkan secara default. Hasil interpretasi perintah dapat berbeda antara shell interaktif dan skrip, jadi disarankan untuk tidak mengandalkan alias dalam otomatisasi.

Apakah type hanya menemukan lokasi file yang dapat dieksekusi?

Tidak. Itu menunjukkan bagaimana Bash menafsirkan nama saat ini dan membedakan alias, kata khusus, fungsi, dan perintah bawaan.

Apakah urutan keluaran type -a merupakan prioritas eksekusi?

Item pertama umumnya membantu memahami target yang dipilih oleh shell saat ini. Namun, hash, opsi shell, dan konteks eksekusi dapat berpengaruh, jadi untuk tugas penting, periksa lingkungan aktual bersama-sama.

Apakah opsi di shell lain cocok?

Mungkin tidak seperti itu. Opsi dalam teks ini didasarkan pada Bash. Untuk Zsh, Dash, dll., silakan periksa bantuan untuk shell tersebut.

Ringkasan

type adalah alat yang membedakan antara alias, fungsi, perintah bawaan, dan file eksekusi dengan nama yang sama serta mendiagnosis resolusi perintah sebenarnya. Dengan output default, Anda dapat membaca penjelasan, menggunakan -a untuk menemukan semua kandidat, -t untuk mendapatkan hanya tipe, dan -P untuk memaksa mencari file eksekusi eksternal.

Ketika perintah berperilaku berbeda dari yang diharapkan, mulai dengan type -a name di shell yang relevan.

Rujuk ke dokumen resmi