Seperti kebanyakan pengguna, saya memiliki banyak alias yang diatur untuk memberikan satu set flag default untuk program yang sering digunakan. Misalnya,
alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
Masalahnya adalah jika saya ingin menggunakan which
untuk melihat di mana vim
saya /grep
/ls
/etc berasal, alias menghalangi:
$ which vim
vim: aliased to vim -X
Ini adalah hasil yang berguna, tetapi bukan yang saya cari dalam kasus ini; Saya tahu vim
alias ke vim -X
tapi saya ingin tahu di mana itu vim
berasal dari.
Singkat untuk sementara tidak mendefinisikan alias supaya saya bisa menggunakan which
di atasnya, apakah ada cara mudah untuk memiliki which
'membuka' alias dan menjalankannya sendiri?
Sunting: Tampaknya which
adalah shell-builtin dengan perilaku yang berbeda di shell yang berbeda. Di Bash, saran SiegeX tentang --skip-alias
pekerjaan bendera; namun, saya menggunakan Zsh. Apakah ada yang serupa di sana?
Jawaban yang Diterima:
which
sebenarnya adalah cara yang buruk untuk melakukan hal-hal seperti ini, karena membuat tebakan tentang lingkungan Anda berdasarkan $SHELL
dan file startup (dipikirkannya) yang digunakan shell; tidak hanya terkadang salah menebak, tetapi Anda biasanya tidak dapat menyuruhnya berperilaku berbeda. (which
di Ubuntu 10.10 saya tidak mengerti --skip-alias
seperti yang disebutkan oleh @SiegeX, misalnya.) type
menggunakan lingkungan shell saat ini alih-alih menyodok file konfigurasi Anda, dan dapat diperintahkan untuk mengabaikan bagian dari lingkungan itu, sehingga ini menunjukkan kepada Anda apa yang sebenarnya akan terjadi daripada apa yang akan terjadi dalam rekonstruksi shell default Anda.
Dalam hal ini, type -P
akan mengabaikan alias atau fungsi apa pun:
$ type -P vim
/usr/bin/vim
Anda juga dapat memintanya untuk mengupas semua lapisan, satu per satu, dan menunjukkan kepada Anda apa yang akan ditemukan:
$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim
(Memperluas ini dari komentar :)
Masalah dengan which
adalah bahwa itu biasanya program eksternal, bukan shell built-in, yang berarti tidak dapat melihat alias atau fungsi Anda dan harus mencoba untuk merekonstruksi mereka dari file startup/config shell. (Jika itu adalah shell built-in, seperti di zsh
tapi ternyata bukan bash
, lebih cenderung menggunakan lingkungan shell dan melakukan hal yang benar.)
type
adalah perintah yang sesuai dengan POSIX yang diperlukan untuk berperilaku seolah-olah itu adalah built-in (yaitu, harus menggunakan lingkungan shell yang dipanggil termasuk alias dan fungsi lokal), jadi biasanya adalah bawaan.
Biasanya tidak ditemukan di csh
/tcsh
, meskipun dalam sebagian besar versi modern dari which
adalah shell builtin dan melakukan hal yang benar; terkadang bawaannya adalah what
sebagai gantinya, dan terkadang tidak ada cara yang baik untuk melihat lingkungan shell saat ini dari csh
/tcsh
sama sekali.