2010-09-15 81 views
2

与大多数makefile一样,我有一些bash脚本使用可执行文件的变量。例如,用于/ usr/bin/mysql的$mysql_exec。我想能够这样说:如何检查可执行文件的路径扩展

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和all)?

回答

3

在bash中,你可以使用内置的type -P以武力对付PATHtype -p的分辨率来显示路径只有当有该名称的别名或功能。使用type可避免调用外部设备,例如which

像这样的东西可能就是你在找什么:

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

是否使用

mysql_exec=mysql 

mysql_exec=/usr/bin/mysql 
+0

很不错的丹尼斯。感谢'型'小费! – 2010-09-16 03:08:16

2

which是一个小程序,用于指定作为自变量的程序检查$PATH

$ which mysql 
/usr/bin/mysql 

另一种有用的工具(未安装在所有系统上,但被包括在GNU的coreutils)是readlinkreadlink可以给你一个完整的绝对路径,没有符号链接。例如:

$ 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,则遵循该符号链接。其余的支票仍然是Kaleb提到的方式。

相关问题