2010-09-15 2 views
2

Как и большинство make-файлов, у меня есть некоторые скрипты bash, которые используют переменные для исполняемых файлов. Например, $mysql_exec для/usr/bin/mysql. Я хотел бы быть в состоянии сказать что-то вроде:Как проверить расширение пути для исполняемых файлов

mysql_exec=mysql

использовать $ PATH или

mysql_exec=/usr/bin/mysql

, чтобы получить абсолютное местоположение без $ PATH. Я также хочу, чтобы проверить, если исполняемый файл действителен, используя что-то вроде этого:

if [ ! -x $mysql_exec ] ...

Однако, эта команда:

if [ ! -x "mysql" ]; then print "oh oh"; fi

На самом деле печатает «о-о», даже если MySQL находится в моей $ PATH. Из командной строки ввод mysql имеет такой же эффект, что и печатать /usr/bin/mysql. Итак, как мне получить bash действительно проверить, является ли $ mysql_exec исполняемым файлом ($ PATH и все)?

ответ

3

В Bash, вы можете использовать встроенный в type -P, чтобы заставить резолюцию против PATH или type -p, чтобы показать путь, только если нет псевдонима или функции с этим именем. Использование type позволяет избежать внешнего вызова, например which.

Нечто подобное может делать то, что вы ищете:

[ -x "$(type -p "$mysql_exec")" ] 

ли вы использовать

mysql_exec=mysql 

или

mysql_exec=/usr/bin/mysql 
+0

Очень хороший Деннис. Спасибо за подсказку 'type'! –

2

which это небольшая программа, которая проверяет $PATH для программы, указанной в качестве аргумента:

$ which mysql 
/usr/bin/mysql 

Еще одна полезная утилита (которая не установлена ​​на всех системах, но входит в GNU Coreutils) является readlink. readlink может дать вам полный и абсолютный путь без символических ссылок. Например:

$ cd ~me/bin 
$ ln -s `which mysql` mysupersql 
$ readlink -f mysupersql 
/usr/bin/mysql  

Я часто использую комбинацию обоих, так что я знаю, что путь как абсолютное, а не символическая:

mysql_exec=$(readlink -f `which mysql`) 
if [ ! -x "$mysql_exec" ] ; then 
    ... 
0

Чтобы добавить ответ Калеб, вы также проверить, если файл является символической ссылкой, используя if [-L $file] и следуйте этой символической ссылке, если вы не можете установить readlink. Остальная часть проверки, однако, остается той, о которой говорил Калеб.

Смежные вопросы