Я хочу смочь сказать, существует ли команда в какой-либо системе POSIX из сценария оболочки.
На Linux я могу сделать следующее:
if which ; then
...snip...
fi
Однако Солярис и MacOS which
не давайте код неисправности выхода, когда команда не существует, они просто печатают сообщение об ошибке к STDOUT.
Кроме того, я недавно обнаружил что which
самой командой не является POSIX (см. http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html),
Какие-либо идеи?
команда -v
- это указанная POSIX команда, которая делает то, что делает.
Она определена для возвращать> 0, если команда не найдена или возникает ошибка.
Вы можете прочитать stdout / stderr из «which» в переменную или массив (используя обратные метки) вместо проверки для кода выхода.
Если в системе нет команды «который» или «где», вы также можете получить содержимое переменной $ PATH, а затем перебрать все каталоги и найти заданный исполняемый файл. Это, по сути, то, что делает (хотя может использовать некоторое кэширование / оптимизацию результатов $ PATH).
POSIX говорит: « Если команда не найдено, выходное состояние должно быть 127. »Так что вы можете сделать
<command>
if [ "${?}" = 127 ]; then
<handle not found>
fi
При написании сценариев оболочки часто допустимо требовать оболочки bash ( #! / bin / bash
), потому что без Массивы практически невозможно правильно обрабатывать аргументы и / или имена файлов с пробелами.