Myślę, że większość zna which
komendę i używam jej często. Właśnie natknąłem się na sytuację, w której jestem ciekawy nie tylko, które polecenie jest pierwsze na mojej ścieżce, ale ile i gdzie znajdują się wszystkie polecenia na wszystkich moich ścieżkach. Próbowałem strony man (pisanie na klawiaturze man which
rozśmieszyło mnie), ale nic nie widziałem.
19
which --all
.which -a
.Odpowiedzi:
W niektórych systemach
which -a
pokazuje wszystkie dopasowania. Jeśli twoją powłoką jest bash lub zsh¹, możesztype
zamiast tego użyć :type foo
pokazuje pierwsze dopasowanie itype -a foo
pokazuje wszystkie dopasowania. Te trzy komendytype
,which
iwhence
zrobić głównie to samo; różnią się między powłokami i systemami operacyjnymi pod względem dostępności, opcji i tego, co dokładnie zgłaszają.type
jest zawsze dostępne i pokazuje wszystkie możliwe nazwy podobne do poleceń (aliasy, słowa kluczowe, wbudowane powłoki, funkcje i polecenia zewnętrzne).Jedynym w pełni przenośnym sposobem wyświetlania wszystkich dopasowań jest parsowanie
$PATH
siebie. Oto skrypt powłoki, który to robi. Jeśli uczynisz ją funkcją powłoki, pamiętaj o umieszczeniu ciała funkcji w nawiasach (aby zmiana na funkcjęIFS
iset -f
nie ucieczka przed nią), i zmieńexit
nareturn
.¹ Lub ksh 93, zgodnie z dokumentacją, chociaż ksh 93s + 2008-01-31 drukuje tylko pierwsze dopasowanie, gdy próbuję.
źródło
sh
kod nie działa poprawnie, jeśli są w nim puste komponenty$PATH
. Zauważ też, że$IFS
jest to separator pól (przynajmniej w powłokach POSIX), podczas gdy w$PATH
, dwukropek jest używany jako separator pól . Zobaczwhich
skrypt znaleziony w Debianie dla poprawnej implementacji.type
wbudowane wksh93u+ 2012-08-01
wydaje się działać poprawnie.Flaga --all lub -a pokaże wszystkie dopasowania na twojej ścieżce oraz aliasy (przynajmniej w Fedorze, Ubuntu i CentOS):
W systemach AIX i Solaris zbliżysz się do:
źródło
$PATH
zawierał spacje lub znaki globowania powłoki.read -r
jest konieczne, aby poradzić sobie z odwrotnymi ukośnikami. To nie jest dobra metoda, ponieważfind
zajmie to dużo czasu i może zwrócić fałszywe dopasowania, jeśli katalog w$PATH
zawiera podkatalogi. Na szczęściefind
nie przydaje się tutaj; zobacz moją odpowiedź.Jeśli nie masz
which
pomocniczej-a
lubwhence
dostępnej, rzuć własną:źródło
set -f
wyłączenia globowania dla niechronionych$PATH
.test -f
nie jest wystarczające, ponieważ potrzebne są tutaj tylko pliki wykonywalne; trzebatest -x
. Hmm, zdaję sobie sprawę, że zapomniałem o regularnym teście plików w moim skrypcie.whence README.txt
wydaje mi się tak mało prawdopodobne, jakwhence "file* wi?h we!rd name"
. Próbuję tylko pokazać, jak łatwo jest przejść$PATH
.ksh i zsh mają wbudowaną powłokę „skąd”.
whence -a
robi to, co chcesz w Zsh:Muszę wyczyścić PATH w Zsh, mam w nim wiele duplikatów.
whence -a
działa inaczej pod ksh:Muszę powiedzieć, że to też wydaje się być potencjalnie użytecznym zachowaniem.
źródło