Как я тестирую, чтобы видеть, существует ли приложение в $PATH?

Для добавления к тому, что все остальные сказали:

1 - Даже при том, что Linux не заботится очень о расширениях, Windows делает, поэтому удостоверьтесь любой файл, который Вы когда-либо планируете на предоставлении, у любого есть соответствующее расширение.

Ограничения с 2 Camel, кажется, являются самыми легкими использовать сценарии с, никакие специальные символы для волнения о escape-последовательностях.

19
19.12.2010, 02:02
2 ответа

Использовать type commandname. Это возвращает true если commandname что-либо исполняемый файл: псевдоним, функция, встроенная или внешняя команда (искавший в $PATH). С другой стороны, используйте command commandname который возвращает true если commandname встроенная или внешняя команда (искавший в $PATH).

exists () {
  type "$1" >/dev/null 2>/dev/null
}

Существует несколько sh вариантов (определенно предPOSIX; я знаю о /bin/sh под OSF1 ≤3.x и некоторыми версиями оболочки Almquist, найденной в ранних версиях NetBSD и нескольких дистрибутивах Linux 20-го века), где type всегда возвраты 0 или не существуют. Я не думаю никакие системы, поставленные с ними это тысячелетие. Если Вы когда-либо встречаетесь с ними, вот функция, которую можно использовать для поиска в $PATH вручную:

exists () { (
    IFS=:
    for d in $PATH; do
      if test -x "$d/$1"; then return 0; fi
    done
    return 1
) }

Эта функция обычно полезна, если Вы хотите исключить созданный-ins и функции и искать имя в $PATH. Большинство оболочек имеет встроенное для этого, command -v, хотя это - относительно недавнее дополнение к POSIX (все еще дополнительный с POSIX:2004). Это - в основном благоприятная для программиста версия type: это печатает полный путь для исполняемого файла в $PATH, пустое название встроенного или функции и определения псевдонима для псевдонима.

exists_in_path () {
  case $(command -v -- "$1") in
    /*) return 0;;
    alias\ *) return 1;; # alias
    *) return 1;; # built-in or function
  esac
}

Ksh, удар и zsh также имеют type -p искать только исполняемые файлы в $PATH. Обратите внимание на это в ударе, статусе возврата type -p foo 0 если foo встроенное или функция; если Вы хотите протестировать на исполняемый файл в $PATH, необходимо проверить, что вывод не пуст. type -p не находится в POSIX; например, пепел Debian (который является /bin/sh на Ubuntu), не имеет его.

19
27.01.2020, 19:45
  • 1
    @gilles пути, будет это (или что-то подобное) if [ type keychain ]; then не работают? Я получаю ошибку /home/xenoterracide/.zshrc:84: parse error: condition expected: type Я предполагаю, что мог записать, что функция существует... Я просто думал, что это могло бы быть более просто в некотором смысле... –  xenoterracide 19.12.2010, 02:00
  • 2
    @xenoterracide: Отбросьте скобки! –  Gilles 'SO- stop being evil' 19.12.2010, 02:03
  • 3
    я думаю, что Вы ищете if type $APP >/dev/null 2>/dev/null; then ... Вы не хотите []. –  Steven D 19.12.2010, 02:05
  • 4
    Вот еще я знал, что должен был обновиться. Избитый Gilles снова! –  Steven D 19.12.2010, 02:06
  • 5
    type -p если Вы конкретно ищете команду в $PATH (не псевдонимы или функции или builtins). –  ephemient 08.01.2011, 08:34

Если Вы только ищете внешние программы, можно также использовать который. Не знайте, как портативный, который является все же.

1
27.01.2020, 19:45
  • 1
    В теории это менее портативно, чем type или command; which не находится в POSIX, например. На практике, which действительно существует почти везде, но в некоторых местах (где это реализовано как csh сценарий) это использует другой путь (из-за a .cshrc), который побеждает цель. –  Gilles 'SO- stop being evil' 19.12.2010, 15:50

Теги

Похожие вопросы