`` hangisi, ama hepsi


19

Sanırım çoğu whichkomuta aşina ve onu sık sık kullanıyorum. Burada ne kadar ve nereden komut benim yoldaki ilk olan sadece merak değilim bir duruma koştu, ama hepsi hepsi benim yollarında komutlardır. Hangi man sayfasını denedim (yazmak man whichbeni güldürdü), ama hiçbir şey görmedim.


1
Benim sistemde, bu adam sayfasında listelenen ilk şey: which --all.
Shawn J. Goff

2
Benimki (linux) sadece which -a.
kullanıcı bilinmiyor

Yanıtlar:


23

Bazı sistemlerde which -atüm eşleşmeleri gösterir. Kabuğunuz bash veya zsh¹ ise, typebunun yerine şunları kullanabilirsiniz : type fooilk eşleşmeyi ve type -a footüm eşleşmeleri gösterir. Üç komutları type, whichve whenceçoğunlukla aynı şeyi yapmak; kullanılabilirlik, seçenekler ve tam olarak neyi rapor ettikleri konusunda kabuklar ve işletim sistemleri arasında farklılık gösterir. typeher zaman kullanılabilir ve olası tüm komut benzeri adları (takma adlar, anahtar kelimeler, kabuk yerleşikleri, işlevler ve harici komutlar) gösterir.

Tüm eşleşmeleri görüntülemenin tek tamamen taşınabilir yolu $PATHkendinizi ayrıştırmaktır . İşte bunu yapan bir kabuk betiği. Bunu bir kabuk işlevi yaparsanız, (değişiklik böylece parantez içinde fonksiyon gövdesini saracak şekilde emin IFSve set -fve değişiklik işlevini kaçış yok) exitiçin return.

#!/bin/sh
set -f       # disable globbing
IFS=:        # break words at : only
not_found=1
for d in $PATH; do
  if [ -f "$d/$x" ] && [ -x "$d/$x" ]; then
    printf '%s\n' "$d/$x"
    not_found=0
  fi
done
exit $not_found

¹ Veya ksh 93, belgelere göre, ksh 93s + 2008-01-31 sadece ilk maçı denediğimde yazdırıyor.


İçinde shboş bileşenler varsa bu kod düzgün çalışmaz $PATH. Ayrıca $IFS, alandayken (en azından POSIX mermilerinde) alan ayırıcı olduğuna dikkat edin $PATH, iki nokta üst üste alan ayırıcı olarak kullanılır . whichDoğru uygulama için Debian'da bulunan komut dosyasına bakın .
Stéphane Chazelas

typeiçinde yerleşik ksh93u+ 2012-08-01düzgün çalışması gibi görünüyor.
Stéphane Chazelas

5

--All veya -a bayrağı yolunuzdaki tüm eşleşmeleri ve takma adları gösterir (en azından Fedora, Ubuntu ve CentOS'ta):

which -a which

AIX ve Solaris'te bu sizi yakınlaştırır:

echo "$PATH" | sed -e 's/:/ /g' | \
while read -r p; do find "$p" -type f -name "which"; done

Parametre ikameleri etrafında çift tırnak işareti kullanmanız gerekir, aksi takdirde $PATHboşluk veya kabuk globbing karakterleri içeriyorsa komut dosyası çalışmaz . read -rters eğik çizgilerle başa çıkmak için gereklidir. Bu iyi bir yöntem değildir çünkü finduzun zaman alacaktır ve içindeki bir dizin $PATHalt dizinler içeriyorsa sahte eşleşmeler döndürebilir . Neyse ki, findburada yararlı değil; cevabımı gör.
Gilles 'SO- kötü olmayı bırak'

Yuvalanmış dizinlerde kesinlikle yavaş olacağından yanlış hissettiğinizi biliyordum. Globbing ve boşluklar $ PATH? eww. Ama haklısın (çok fazla söylemeyecek kadar iyiydin): Tek astarım kötü yazılmıştı.
Eli Heady

1

Eğer bir yoksa whichdestekleyici -aya whencemevcuttur, rulo kendi:

#!/bin/sh -f

IFS=":"
for PART in $PATH
do
  if test -x "$PART/$1"
  then
    echo $PART/$1
  fi
done

Sen kaçırdığını set -fkorumasız üzerinde globbing kapatmak için $PATH. test -fburada yalnızca yürütülebilir dosyalar istendiğinden yeterli değildir; ihtiyacınız var test -x. Hmm, betiğimdeki normal dosya testini unuttuğumu fark ettim.
Gilles 'SO- kötü olmayı

@Gilles: ipuçlarınıza göre düzenlenmiştir. Tamamen doğruluk için geldim, ama ben whence README.txtmümkün değil whence "file* wi?h we!rd name". Sadece hareket etmenin ne kadar kolay olduğunu göstermeye çalışıyorum $PATH.
MattBianco

0

ksh ve zsh yerleşik bir kabuk olarak "nereye" sahiptir. whence -azsh altında istediğinizi yapar:

 7:27AM 7 % whence -a cat
/usr/bin/cat
/bin/cat
/usr/bin/cat
/bin/cat

PATH'i zsh ile temizlemeliyim, içinde birçok kopya var. whence -aksh altında farklı çalışır:

$ whence -a cat
cat is a tracked alias for /usr/bin/cat

Söylemeliyim ki, bu da potansiyel olarak yararlı bir davranış gibi görünüyor.

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.