Seperti kebanyakan pengguna, saya memiliki banyak alias yang disiapkan untuk memberikan serangkaian 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 dari mana vim
/ grep
/ ls
/ etc saya berasal, alias menghalangi:
$ which vim
vim: aliased to vim -X
Ini adalah hasil yang bermanfaat, tetapi bukan yang saya cari dalam kasus ini; Saya tahu vim
ini alias ke vim -X
tapi saya ingin tahu di mana yang vim
datang dari.
Singkat untuk sementara tidak mendefinisikan alias supaya saya bisa menggunakannya which
, apakah ada cara mudah untuk which
'membuka' alias dan menjalankannya sendiri?
Sunting: Tampaknya which
shell-builtin dengan perilaku berbeda di shell yang berbeda. Di Bash, saran SiegeX tentang --skip-alias
bendera berfungsi; Namun, saya menggunakan Zsh. Apakah ada yang serupa di sana?
vim
datangnya , Anda akan menggunakanwhere vim
Jawaban:
which
sebenarnya adalah cara yang buruk untuk melakukan hal-hal seperti ini, karena membuat perkiraan tentang lingkungan Anda berdasarkan$SHELL
dan file startup (menurutnya) yang digunakan shell; tidak hanya kadang-kadang menebak salah, tetapi secara umum Anda tidak bisa mengatakannya untuk berperilaku berbeda. (which
pada Ubuntu 10.10 saya tidak mengerti--skip-alias
seperti yang disebutkan oleh @ SiegeX, misalnya.)type
Menggunakan lingkungan shell saat ini daripada melihat-lihat file konfigurasi Anda, dan dapat diberitahu untuk mengabaikan bagian-bagian dari lingkungan itu, sehingga ia menunjukkan kepada Anda apa yang sebenarnya akan terjadi alih-alih apa yang akan terjadi dalam rekonstruksi shell default Anda.Dalam hal ini,
type -P
akan memotong alias atau fungsi apa pun:Anda juga dapat memintanya untuk melepaskan semua lapisan, satu per satu, dan menunjukkan kepada Anda apa yang akan ditemukan:
(Memperluas ini dari komentar :)
Masalahnya
which
adalah biasanya ini adalah program eksternal daripada built-in shell, yang berarti ia tidak dapat melihat alias atau fungsi Anda dan harus mencoba merekonstruksi mereka dari file startup / config shell. (Jika itu adalah built-in shell, seperti yang ada di dalamzsh
tetapi tampaknya tidakbash
, itu lebih mungkin untuk menggunakan lingkungan shell dan melakukan hal yang benar.)type
adalah perintah POSIX-compliant yang diperlukan untuk berperilaku seolah-olah itu built-in (yaitu, harus menggunakan lingkungan shell itu dipanggil dari termasuk alias lokal dan fungsi), sehingga biasanya adalah built-in.Ini umumnya tidak ditemukan di
csh
/tcsh
, meskipun di sebagian besar versi modern ituwhich
adalah shell builtin dan melakukan hal yang benar; terkadang built-inwhat
sebagai gantinya, dan kadang-kadang tidak ada cara yang baik untuk melihat lingkungan shell saat ini daricsh
/tcsh
sama sekali.sumber
type -a
sepertinya mengembalikan semua contoh pada Anda$PATH
, bukan hanya yang pertama. Saya pikir saya akan aliaswhich
untuktype
:)type
merupakan bagian dari standar POSIX maka itu adalah cara untuk pergi. Untuk menjawab pertanyaan saya, ketik berfungsi di zsh juga (di Debian). Mengapa distribusi tidak dibuangwhat
danwhich
jika distandarisasi dan tidak memiliki fungsionalitas tambahan?info bash 'Bash builtins'
di Linux, meskipun Anda juga bisa mendapatkannya darizsh
manual referensi. Lebih resmi, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (yang saya perhatikan sebenarnya bukan spec-P
atau-a
, atau bahkan-p
yang merupakan bentuk asli dari-P
, tetapi mengharuskannya menggunakan lingkungan shell saat ini).type -p
berperilaku berbeda antara zsh dan bash.type -P
tidak ada di zsh sama sekali.Di
bash
:Di
zsh
:Di keduanya:
Atau:
sumber
In zsh
which
adalah builtin karena perintah ini melaporkan:Untuk menjalankan perintah eksternal (dalam shell apa pun)
which
, gunakan Path Lengkap :dengan demikian perintah
ls
ditemukan (nilai keluar 0), dan terletak di/bin/ls
.Di dalam
zsh
; cara (di samping yang di atas) untuk mencari perintah eksternal adalah:Namun, itu tidak akan menyelesaikan alias bersarang seperti:
Perintah akan melaporkan bahwa tidak ada
dire
perintah yang ditemukan.Untuk menyelesaikan alias bersarang (secara manual) lihat
Resolve nested aliases to their source commands
sumber
Milik saya didefinisikan seperti itu
sumber
Coba yang berikut ini:
sumber
which
sebenarnya itu adalah built-in shell dan bukan utilitas Unix biasa seperti yang saya duga. Jadi saya harus mengedit pertanyaan saya dan menentukan Zsh. Terima kasih telah menunjukkan ini padaku!which
bukan builtin, setidaknya bukan pada Debian. Ini adalah skrip shell, dan bagian dari debianutils, jadi berfungsi pada zsh. Namun,--skip-alias
bukan merupakan opsiwhich
pada Debian. Apakah ada berbagai varietaswhich
mengambang di sekitar? Ini bukan apppear menjadi perintah standar.man zshbuiltins
. yang [-wpams] beri nama ... Setara dengan dari mana -c.bash
, ini bukan bawaan dan tidak memiliki--skip-alias
opsi./usr/bin/which
plus alias/etc/profile.d
yang memungkinkannya menangani alias tetapi--skip-alias
berfungsi. Akibatnyawhich which
menunjukkan alias, tetapicommand which which
menunjukkan dieksekusi!Alternatif lain adalah
command which vim
, yang bekerja dengan cara yang sama di keduanyazsh
danbash
Misalnya di mac saya:
sumber
Keduanya
type
danwhich
berperilaku berbeda sesuai dengan jenis shell Anda.Di bash,
which
ada perintah diPATH
. Itu mencari perintah yang Anda berikanPATH
. Bash builtintype -P
(P forPATH
) berperilaku persis sepertiwhich
.Dalam zsh, baik
which
dantype
yang builtin, dan fungsi parsial builtinwhence
.which -p
adalah apa yang kamu inginkan. Ini memaksa pencarian jalur. (-P
opsi tidak tersedia untuktype
ZSH.)Lebih banyak dari manual ZSH.
Untuk melewati
builtin
which
dan memaksa menggunakan perintahwhich
dariPATH
dalam ZSH:sumber