На некоторых системах which -a
показывает все совпадения. Если ваша оболочка bash или zsh¹, вы можете использовать type
вместо нее : type foo
показывает первое совпадение и type -a foo
показывает все совпадения. Три команды type
, which
и whence
делают в основном то же самое; они различаются между оболочками и операционными системами по доступности, опциям и что именно они сообщают. type
всегда доступен и показывает все возможные имена, подобные командам (псевдонимы, ключевые слова, встроенные функции оболочки, функции и внешние команды).
Единственный полностью переносимый способ отобразить все совпадения - это проанализировать $PATH
себя. Вот сценарий оболочки, который делает это. Если вы сделаете это функция оболочки, убедитесь , чтобы приложить тело функции в скобках (так что изменение IFS
и set -f
не убегают функции), и изменение exit
к 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
¹
Или ksh 93, согласно документации, хотя ksh 93s + 2008-01-31 печатает только первое совпадение, когда я пытаюсь.
which --all
.