与大多数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)?
答案 0 :(得分:3)
在Bash中,您可以使用内置type -P
强制解析PATH
或type -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中)是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
...
答案 2 :(得分:0)
要添加Kaleb的答案,您还可以使用if [-L $file]
检查文件是否为符号链接,如果无法安装readlink,请按照该符号链接进行操作。其余的检查仍然是Kaleb提到的方式。