На некоторых системах 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.