2010-09-15 106 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提到的方式。