Для добавления к тому, что все остальные сказали:
1 - Даже при том, что Linux не заботится очень о расширениях, Windows делает, поэтому удостоверьтесь любой файл, который Вы когда-либо планируете на предоставлении, у любого есть соответствующее расширение.
Ограничения с 2 Camel, кажется, являются самыми легкими использовать сценарии с, никакие специальные символы для волнения о escape-последовательностях.
Использовать 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), не имеет его.
Если Вы только ищете внешние программы, можно также использовать который. Не знайте, как портативный, который является все же.
type
или command
; which
не находится в POSIX, например. На практике, which
действительно существует почти везде, но в некоторых местах (где это реализовано как csh сценарий) это использует другой путь (из-за a .cshrc
), который побеждает цель.
– Gilles 'SO- stop being evil'
19.12.2010, 15:50
if [ type keychain ]; then
не работают? Я получаю ошибку/home/xenoterracide/.zshrc:84: parse error: condition expected: type
Я предполагаю, что мог записать, что функция существует... Я просто думал, что это могло бы быть более просто в некотором смысле... – xenoterracide 19.12.2010, 02:00if type $APP >/dev/null 2>/dev/null; then ...
Вы не хотите[]
. – Steven D 19.12.2010, 02:05type -p
если Вы конкретно ищете команду в$PATH
(не псевдонимы или функции или builtins). – ephemient 08.01.2011, 08:34