如何检查可执行文件的路径扩展

时间:2010-09-15 19:14:28

标签: bash

与大多数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 个答案:

答案 0 :(得分:3)

在Bash中,您可以使用内置type -P强制解析PATHtype -p,只有在该名称没有别名或功能时才显示路径。使用type可以避免调用which等外部信息。

这样的事情可以做你想要的事情:

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

是否使用

mysql_exec=mysql

mysql_exec=/usr/bin/mysql

答案 1 :(得分: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
    ...

答案 2 :(得分:0)

要添加Kaleb的答案,您还可以使用if [-L $file]检查文件是否为符号链接,如果无法安装readlink,请按照该符号链接进行操作。其余的检查仍然是Kaleb提到的方式。