Подтвердить что ты не робот

Узнайте, существует ли команда POSIX

Я хочу узнать, существует ли какая-либо команда в любой системе POSIX из оболочки script.

В Linux я могу сделать следующее:

if which <command>; then
   ...snip...
fi

Однако Solaris и MacOS which не выдают код сбоя выхода, когда команда не существует, они просто печатают сообщение об ошибке в STDOUT.

Кроме того, я недавно обнаружил, что сама команда which не является POSIX (см. http://www.opengroup.org/onlinepubs/009695399/utilities/)

Любые идеи?

4b9b3361

Ответ 1

command -v - это заданная команда POSIX, которая делает то, что делает.

Определено, чтобы возвращать > 0, когда команда не найдена или произошла ошибка.

Ответ 2

POSIX действительно говорит: " Если команда не найдена, статус выхода должен быть 127." Таким образом, вы могли бы сделать

<command>
if [ "${?}" = 127 ]; then
   <handle not found>
fi

При написании сценариев оболочки часто допускается использование оболочки bash (#!/bin/bash), потому что без массивов ее практически невозможно обрабатывать аргументы и/или имена файлов с пробелами правильно. В этом случае bash builtin type -p эквивалентен тому, что и потому что он встроен, он переносится.

Ответ 3

Вы можете прочитать stdout/stderr из "which" в переменную или массив (используя обратные шаги), а не проверять код выхода.

Если в системе нет команды "кто" или "where", вы также можете захватить содержимое переменной PATH, а затем перебрать все каталоги и выполнить поиск данного исполняемого файла. Это, по сути, то, что делает (хотя он может использовать некоторое кэширование/оптимизацию результатов $PATH).