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