Узнайте, существует ли команда в системе POSIX - PullRequest
16 голосов
/ 18 апреля 2009

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

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

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

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

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

Есть идеи?

Ответы [ 3 ]

22 голосов
/ 18 апреля 2009

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

Определено для возврата> 0, если команда не найдена или возникает ошибка.

2 голосов
/ 18 апреля 2009

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

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

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

0 голосов
/ 18 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...