Я думаю, что большинство знакомо с which
командой, и я использую ее часто. Я просто столкнулся с ситуацией, когда мне любопытно не только какая команда находится на моем пути первой, но сколько и где все команды на всех моих путях. Я попробовал справочную страницу (печатание man which
заставило меня смеяться), но ничего не увидел.
19
which --all
.which -a
.Ответы:
На некоторых системах
which -a
показывает все совпадения. Если ваша оболочка bash или zsh¹, вы можете использоватьtype
вместо нее :type foo
показывает первое совпадение иtype -a foo
показывает все совпадения. Три командыtype
,which
иwhence
делают в основном то же самое; они различаются между оболочками и операционными системами по доступности, опциям и что именно они сообщают.type
всегда доступен и показывает все возможные имена, подобные командам (псевдонимы, ключевые слова, встроенные функции оболочки, функции и внешние команды).Единственный полностью переносимый способ отобразить все совпадения - это проанализировать
$PATH
себя. Вот сценарий оболочки, который делает это. Если вы сделаете это функция оболочки, убедитесь , чтобы приложить тело функции в скобках (так что изменениеIFS
иset -f
не убегают функции), и изменениеexit
кreturn
.¹ Или ksh 93, согласно документации, хотя ksh 93s + 2008-01-31 печатает только первое совпадение, когда я пытаюсь.
источник
sh
код не работает должным образом, если в нем есть пустые компоненты$PATH
. Также обратите внимание, что$IFS
это разделитель полей (по крайней мере в оболочках POSIX), в то время как$PATH
двоеточие используется в качестве разделителя полей . Смотритеwhich
скрипт, найденный в Debian, для правильной реализации.type
встроенный в ,ksh93u+ 2012-08-01
кажется, работает правильно.Флаг --all или -a покажет вам все совпадения на вашем пути и псевдонимы (по крайней мере, в Fedora, Ubuntu и CentOS):
В AIX и Solaris это приблизит вас:
источник
$PATH
содержит пробелы или символы-заглушки оболочки.read -r
необходимо справиться с обратными слешами. Это не очень хороший метод, потому чтоfind
он займет много времени и может вернуть ложные совпадения, если каталог$PATH
содержит подкаталоги. К счастью, здесьfind
это не полезно; смотри мой ответ.Если у вас нет
which
поддержки-a
илиwhence
нет, сверните свои собственные:источник
set -f
выключения болтовни на незащищенных$PATH
.test -f
недостаточно, так как здесь требуются только исполняемые файлы; вам нужноtest -x
. Хм, я понимаю, что я забыл обычный тест файла в моем сценарии.whence README.txt
так же маловероятно, какwhence "file* wi?h we!rd name"
. Просто пытаюсь показать, как легко пройти$PATH
.ksh и zsh имеют «откуда» как встроенную оболочку.
whence -a
делает то, что вы хотите под Zsh:Я должен очистить PATH в Zsh, у меня есть много дубликатов в нем.
whence -a
иначе работает под ksh:Должен сказать, что это тоже кажется потенциально полезным поведением.
источник