Takma komutta `hangisini nasıl kullanılır?


76

Çoğu kullanıcı gibi, sık kullanılan programlar için varsayılan bayrak kümesi vermek üzere ayarlanmış bir grup takma adım var. Örneğin,

alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'

Sorun şu ki, / / / etc 'in nereden geldiğini whichgörmek istersem takma ismin önüne geçilir:vimgrepls

$ which vim
vim: aliased to vim -X

Bu yararlı çıktı, ancak bu durumda aradığım şey değil; Biliyorum vim, diğer ad olarak vim -Xama nerede olduğunu bilmek istiyorum o vim geliyor.

Takma adı geçici olarak tanımlamak yerine, kullanabilmem whichiçin which, takma adı 'paketinden çıkarmak ' ve bunun üzerinde çalışmanın kolay bir yolu var mı?

Düzenleme:which Farklı mermilerde farklı davranışlara sahip bir kabuk yerleşik olduğu anlaşılıyor . Bash'te SiegeX'in --skip-aliasbayrak önerisi işe yarıyor; Ancak, ben Zsh yaşıyorum. Orada benzer bir şey var mı?


zsh içinde, eğer bilmek istiyorum o nereye vimgeldiğini , kullanmak istiyorumwhere vim
Matija Nalis

Yanıtlar:


105

whichaslında, ortamınıza $SHELLve kabuğun kullandığı başlangıç ​​dosyalarına dayalı olarak tahmin ettiği gibi, bunun gibi şeyler yapmanın kötü bir yoludur ; sadece bazen yanlış tahmin etmekle kalmaz, fakat genellikle farklı davranmasını söyleyemezsiniz. ( whichBenim Ubuntu 10.10 üzerinde anlamıyor --skip-aliasörneğin @SiegeX tarafından belirtildiği gibi.) typeYerine yapılandırma dosyalarının de alay mevcut kabuk ortamını kullanır ve bu ortamın parçalarını görmezden anlattı olabilir, bu nedenle sizi gösterir aslında ne olacak varsayılan kabuğunuzun yeniden yapılandırılmasında olanların yerine gerçekleşir.

Bu durumda, type -Ptakma adları veya işlevleri atlar:

$ type -P vim
/usr/bin/vim

Ayrıca , bir kerede tüm katmanları soymasını ve ne bulacağını göstermesini isteyebilirsiniz:

$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim

(Bu yorumlardan genişleterek :)

Buradaki sorun whichgenellikle bir kabuk yerine harici bir program olması, yani takma adlarınızı veya işlevlerinizi göremiyor ve onları kabuğun başlangıç ​​/ config dosyalarından yeniden yapılandırmayı denemek zorunda kalıyor. (Eğer bir kabuk yerleşikse, içinde olduğu gibi zshama görünüşe göre değilse bash, kabuğun çevresini kullanması ve doğru şeyi yapması daha olasıdır.)

typeo sanki davranmaya gerekli olan bir POSIX uyumlu komut yerleşik bir (yani, buna yerel adlar ve işlevleri de dahil olmak üzere çağrılan kabuğun ortamını kullanmaları gerekir), bu yüzden genellikle olduğu yerleşik bir.

Genellikle csh/ içinde bulunmaz tcsh, ancak çoğu modern sürümünde whichbir kabuk yerleşiktir ve doğru olanı yapar; bazen yerleşiktir whatve bazen mevcut kabuğun çevresini csh/ içinden görmenin iyi bir yolu yoktur tcsh.


6
Teşekkürler! Bu, çantama numaramı eklemek için çok yararlı bir şey. Özellikle de sadece ilki değil tüm örneklerinizi type -ageri veriyor gibiyim . Sanırım ben takma ad vereceğim :)$PATHwhichtype
Adrian Petrescu

2
@ geekosaur: Teşekkürler. Eğer typePOSIX standardının parçası olan o gitmek yoludur. Sorumu yanıtlamak için, zsh üzerinde de (Debian'da) yazın. Dağıtımlar neden kurtulmuyor whatve whichstandartlaştırılmıyorsa ve ekstra işlevselliğe sahip değilse?
Faheem Mitha

1
Hayır, uzaktan bile değil.
geekosaur

1
@Faheem: Yeniden dökümantasyon, info bash 'Bash builtins'Linux ile başlayacağım , ancak zshreferans el kitabından da alabilirsiniz . Daha resmen pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (I not aslında spec vermez -Pveya -ahatta -pözgün formu olan -P, ancak şu anki kabuk ortamını kullanmanızı gerektirir).
geekosaur

2
type -pzsh ve bash arasında farklı davranır. type -Phiç zsh içinde mevcut değil.
kojiro

15

İçinde bash:

type -P vim

İçinde zsh:

type -p vim

Hem de:

/usr/bin/which vim

Veya:

( unalias vim; type vim )

2
Sonuncusu havalı. Bunu yapmak için bir takma ad alabiliriz. :)
balki

Redhat bash Ben doğru cevap istiyorsanız, -P türünü kullanmalı ve hangisini kullanmam gerekir. Diğer adlar veya işlevler söz konusu değildir.

Dr Eval, hangi "hangisi"? Hangi Kırmızı Şapka?
Mikel

@Mikel RH7.4. GNU olan v2.20.

4

Zsh olarak whichbu komut raporları gibi bir yerleşiğidir:

$ whence -w which
which: builtin

Harici komutu çalıştırmak için (herhangi bir kabukta) which, Tam Yolu kullanın :

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

Böylece komut lsbulundu (0 çıkış değeri) ve bulunur /bin/ls.

İçinde zsh; harici komutları aramanın bir yolu (yukarıdakilerin yanında) :

$ whence -p ls
/bin/ls

Ancak, bu gibi iç içe takma adları çözmez:

$ alias dire='ls -l'

Komut, hiçbir direkomut bulunamadığını bildirir .

$ whence -p dire; echo $?
1

İç içe takma adları çözümlemek için (el ile) Resolve nested aliases to their source commands


2

Maden böyle tanımlandı

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

1

Takip etmeyi dene:

which --skip-alias vim

1
İlginç! Bu, Bash üzerinde çalışır, fakat Zsh'de olmaz (Gerçekten bunun kabuk bağımlı olacağını düşünmedim). Bu, benim whichtahmin ettiğim gibi normal bir Unix yardımcı programının değil, yerleşik bir kabuk olduğunu anlamamı sağladı . Bu yüzden sorumu düzeltip Zsh belirtmeliyim. Bunu bana gösterdiğin için teşekkürler!
Adrian Petrescu

whichbir yerleşik değil, en azından Debian'da değil. Bu bir kabuk betiği ve debianutils'in bir parçası olduğundan, zsh üzerinde çalışır. Ancak, Debian'da --skip-aliasbir seçenek değildir which. whichEtrafta yüzen farklı çeşitler var mı? Bu standart bir komut olarak görünmüyor.
Faheem Mitha

@ Faheem Mitha: Bu bir zsh yerleşiktir. Bakın man zshbuiltins. hangi [-wpams] adı ... -c.
Mikel

Evet, Xubuntu'da bash, yerleşik değil ve --skip-aliasseçeneğe sahip değil .
polim

CentOS (ve RHEL?) 6'da, çalıştırılabilir bir /usr/bin/whichartı diğer /etc/profile.dadlarla başa çıkabilmesini sağlayan ancak --skip-aliasçalışan bir takma addır . Sonuç olarak which whichtakma adı command which whichgösterir , ancak çalıştırılabilir!
dave_thompson_085

0

Bir başka alternatif command which vimhem de aynı şekilde çalışır, zshvebash

Örneğin, mac üzerinde:

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

Ah yeterince adil.
Zee Alexander

0

Her ikisi de typeve whichkabuk türüne göre farklı davranırlar.

Bash, whichiçinde bir komut var PATH. Sağladığınız komutu arar PATH. Bash yerleşik type -P(P for PATH) tam olarak aynı şekilde davranır which.

ZSH, her iki whichve typebuiltins ve yerleşiği kısmi işlevlerdir whence. which -pİstediğin şey bu. Bir yol aramaya zorlar. ( ZSH -Piçin seçenek mevcut değildir type.)

[-vcwfpamsS] [-x num] adından dolayı ...

-p

Takma ad, ayrılmış sözcük, kabuk işlevi veya yerleşik olsa bile ad için bir yol araması yapın.

ZSH manual'tan daha fazlası.

hangi [-wpamsS] [-x num] adı ...

Buraya eşdeğer -c.

Atlamak için builtin whichve kullanım komutu zorlamak whichgelen PATHZSH içinde:

alias which="command which"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.