Bagaimana cara menggunakan `yang` pada perintah alias?


76

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 whichuntuk 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 vimini alias ke vim -Xtapi 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 whichshell-builtin dengan perilaku berbeda di shell yang berbeda. Di Bash, saran SiegeX tentang --skip-aliasbendera berfungsi; Namun, saya menggunakan Zsh. Apakah ada yang serupa di sana?


di zsh, jika Anda ingin tahu dari mana vimdatangnya , Anda akan menggunakanwhere vim
Matija Nalis

Jawaban:


105

whichsebenarnya adalah cara yang buruk untuk melakukan hal-hal seperti ini, karena membuat perkiraan tentang lingkungan Anda berdasarkan $SHELLdan file startup (menurutnya) yang digunakan shell; tidak hanya kadang-kadang menebak salah, tetapi secara umum Anda tidak bisa mengatakannya untuk berperilaku berbeda. ( whichpada Ubuntu 10.10 saya tidak mengerti --skip-aliasseperti yang disebutkan oleh @ SiegeX, misalnya.) typeMenggunakan 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 -Pakan memotong alias atau fungsi apa pun:

$ type -P vim
/usr/bin/vim

Anda juga dapat memintanya untuk melepaskan 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 :)

Masalahnya whichadalah 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 dalam zshtetapi tampaknya tidak bash, itu lebih mungkin untuk menggunakan lingkungan shell dan melakukan hal yang benar.)

typeadalah 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 itu whichadalah shell builtin dan melakukan hal yang benar; terkadang built-in whatsebagai gantinya, dan kadang-kadang tidak ada cara yang baik untuk melihat lingkungan shell saat ini dari csh/ tcshsama sekali.


6
Terima kasih! Ini adalah sesuatu yang sangat berguna untuk ditambahkan ke tas trik saya. Saya terutama seperti itu type -asepertinya mengembalikan semua contoh pada Anda $PATH, bukan hanya yang pertama. Saya pikir saya akan alias whichuntuk type:)
Adrian Petrescu

2
@ geekosaur: Terima kasih. Jika typemerupakan bagian dari standar POSIX maka itu adalah cara untuk pergi. Untuk menjawab pertanyaan saya, ketik berfungsi di zsh juga (di Debian). Mengapa distribusi tidak dibuang whatdan whichjika distandarisasi dan tidak memiliki fungsionalitas tambahan?
Faheem Mitha

1
Tidak, bahkan tidak dari jarak jauh.
geekosaur

1
@Faheem: dokumentasi ulang, saya akan mulai dengan info bash 'Bash builtins'di Linux, meskipun Anda juga bisa mendapatkannya dari zshmanual referensi. Lebih resmi, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (yang saya perhatikan sebenarnya bukan spec -Patau -a, atau bahkan -pyang merupakan bentuk asli dari -P, tetapi mengharuskannya menggunakan lingkungan shell saat ini).
geekosaur

2
type -pberperilaku berbeda antara zsh dan bash. type -Ptidak ada di zsh sama sekali.
kojiro

15

Di bash:

type -P vim

Di zsh:

type -p vim

Di keduanya:

/usr/bin/which vim

Atau:

( unalias vim; type vim )

2
Yang terakhir itu keren. Kami dapat memiliki alias untuk melakukan ini. :)
balki

Dalam bash pada redhat saya harus menggunakan tipe -P, dan bukan yang mana, jika saya ingin jawaban yang benar. Tidak ada alias atau fungsi yang diperhatikan.

Dr Eval, yang "mana"? Red Hat yang mana?
Mikel

@Ikel RH7.4. GNU yang v2.20.

4

In zsh whichadalah builtin karena perintah ini melaporkan:

$ whence -w which
which: builtin

Untuk menjalankan perintah eksternal (dalam shell apa pun) which, gunakan Path Lengkap :

$ /bin/which ls; echo $?
/bin/ls
0

dengan demikian perintah lsditemukan (nilai keluar 0), dan terletak di /bin/ls.

Di dalam zsh; cara (di samping yang di atas) untuk mencari perintah eksternal adalah:

$ whence -p ls
/bin/ls

Namun, itu tidak akan menyelesaikan alias bersarang seperti:

$ alias dire='ls -l'

Perintah akan melaporkan bahwa tidak ada direperintah yang ditemukan.

$ whence -p dire; echo $?
1

Untuk menyelesaikan alias bersarang (secara manual) lihat Resolve nested aliases to their source commands


2

Milik saya didefinisikan seperti itu

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

1

Coba yang berikut ini:

which --skip-alias vim

1
Menarik! Ini bekerja pada Bash, tetapi tidak pada Zsh (saya benar-benar tidak berpikir ini akan tergantung pada shell). Ini membuat saya sadar bahwa whichsebenarnya 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!
Adrian Petrescu

whichbukan builtin, setidaknya bukan pada Debian. Ini adalah skrip shell, dan bagian dari debianutils, jadi berfungsi pada zsh. Namun, --skip-aliasbukan merupakan opsi whichpada Debian. Apakah ada berbagai varietas whichmengambang di sekitar? Ini bukan apppear menjadi perintah standar.
Faheem Mitha

@Faheem Mitha: Ini adalah zsh builtin. Lihat man zshbuiltins. yang [-wpams] beri nama ... Setara dengan dari mana -c.
Mikel

Ya di Xubuntu bash, ini bukan bawaan dan tidak memiliki --skip-aliasopsi.
polym

Pada CentOS (dan RHEL?) 6, ini adalah executable /usr/bin/whichplus alias /etc/profile.dyang memungkinkannya menangani alias tetapi --skip-aliasberfungsi. Akibatnya which whichmenunjukkan alias, tetapi command which whichmenunjukkan dieksekusi!
dave_thompson_085

0

Alternatif lain adalah command which vim, yang bekerja dengan cara yang sama di keduanya zshdanbash

Misalnya di mac saya:

LOLcalhost :: ~ % command which grep
/usr/local/bin/grep

Ah cukup adil.
Zee Alexander

0

Keduanya typedan whichberperilaku berbeda sesuai dengan jenis shell Anda.

Di bash, whichada perintah di PATH. Itu mencari perintah yang Anda berikan PATH. Bash builtin type -P(P for PATH) berperilaku persis seperti which.

Dalam zsh, baik whichdan typeyang builtin, dan fungsi parsial builtin whence. which -padalah apa yang kamu inginkan. Ini memaksa pencarian jalur. ( -Popsi tidak tersedia untuk typeZSH.)

dimana [-vcwfpamsS] nama [-x num] ...

p

Lakukan pencarian path untuk nama bahkan jika itu adalah alias, kata yang dipesan, fungsi shell atau builtin.

Lebih banyak dari manual ZSH.

yang [-wpamsS] [-x num] nama ...

Setara dengan mana -c.

Untuk melewati builtin whichdan memaksa menggunakan perintah whichdari PATHdalam ZSH:

alias which="command which"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.