Я пытаюсь написать все свои sh
сценарии запуска / env для работы с таким большим количеством СУХОГО и столько: «работает на каждом * nix, к которому я клонирую», насколько это возможно. Это означает, что, если я попытаюсь запустить код, которого нет, код завершится неудачно. Для этого мне нужно иметь возможность проверить, существуют ли программы. Я знаю, как проверить, существует ли файл, но я не уверен, как проверить, является ли приложение исполняемым в пути. Я бы предпочел использовать $ PATH, так как некоторые из них должны работать с arch, ubuntu и centos. Некоторые из них могут быть установлены в моем домашнем каталоге, в системах, где у меня нет root, другие могут не быть установлены, а другие все же могут быть установлены по системным путям.
источник
Ответы:
Использование
type commandname
. Возвращает true, еслиcommandname
выполняется что-либо: псевдоним, функция, встроенная или внешняя команда (ищется в$PATH
). В качестве альтернативы используйте use,command commandname
который возвращает true, еслиcommandname
это встроенная или внешняя команда (ищется в$PATH
).Есть несколько вариантов sh (определенно pre-POSIX; я знаю о
/bin/sh
OSF1 ≤3.x и некоторых версиях оболочки Almquist, обнаруженных в ранних версиях NetBSD и нескольких дистрибутивах Linux 20-го века), гдеtype
всегда возвращается 0 или нет существует. Я не думаю, что какие-либо системы поставлялись с ними в этом тысячелетии. Если вы когда-либо сталкивались с ними, вот функция, которую вы можете использовать для поиска$PATH
вручную:Эта функция обычно полезна, если вы хотите исключить встроенные модули и функции и найти имя в
$PATH
. Большинство оболочек имеют встроенные средства для этого,command -v
хотя это относительно недавнее дополнение к POSIX (все еще необязательное для POSIX: 2004). Это в основном дружественная для программиста версияtype
: она печатает полный путь к исполняемому файлу$PATH
, пустое имя для встроенной функции или функции и определение псевдонима для псевдонима.Ksh, bash и zsh также должны
type -p
искать только исполняемые файлы в$PATH
. Обратите внимание, что в bash статус возвратаtype -p foo
равен 0, еслиfoo
это встроенная функция или функция; Если вы хотите проверить на исполняемый файл в$PATH
, вы должны убедиться, что вывод не пустой.type -p
не в POSIX; например, у пепла Debian (который есть/bin/sh
в Ubuntu) его нет.источник
if [ type keychain ]; then
не будет работать? Я получаю ошибку,/home/xenoterracide/.zshrc:84: parse error: condition expected: type
я полагаю, я мог бы написать, что функция существует ... Я просто подумал, что это может быть проще в некотором смысле ...if type $APP >/dev/null 2>/dev/null; then ...
Вы не хотите[]
.type -p
если вы специально ищете команду в$PATH
(не псевдонимы или функции или встроенные).Если вы ищете только внешние программы, вы также можете использовать какие. Не знаю, насколько это портативно.
источник
type
илиcommand
;which
например, не в POSIX. На практикеwhich
он существует почти везде, но в некоторых местах (где он реализован в виде сценария csh) он использует другой путь (из-за.cshrc
), что противоречит цели.