2011-09-01 47 views
2

我正在編寫一個腳本,我需要在用戶的$ PATH上查找命令並獲取命令的完整路徑。問題是我不知道用戶的登錄shell是什麼,或者他們的do文件中可能有什麼奇怪的東西。我爲我的簡單小腳本使用了Bourne shell,因爲它需要在一些可能沒有bash的較早版本的Solaris平臺上運行。

「which」和「whence」的某些實現將獲取用戶的點文件,並且這對於所有用戶來說都不是真正可移植的。我很喜歡一個簡單的UNIX實用程序,它只是爲可執行文件掃描PATH的基本工作並報告第一個匹配的完整路徑。

但我會解決任何對所有用戶都穩定的/ bin/sh解決方案。

我正在尋找一個比編寫我自己的/ bin/sh循環更好的解決方案,這個循環可以截斷$ PATH並一次搜索一行。看起來這很普遍,應該有一種可重用的方式來做到這一點。

我的「漫長的道路」第一近似值是這樣的:

IFS=: 
    for i in $PATH; do 
     if [ -x $i/$cmd ]; then 
      echo $i/$cmd 
     fi 
    done 

有沒有更簡單的東西和便攜式?

+0

你在找什麼? – 2011-09-01 23:20:32

+0

你需要擔心他們所有的點文件等嗎?腳本運行時,用戶是否已經在shell中?也就是說,這些文件已經來源了? –

+0

問題是,如果我的.profile只爲ksh設置,並且我的sh腳本最終將它作爲運行'which'或'whence'命令的一部分來源。我的Solaris 11機箱上的'whence'手冊頁是指內置的ksh。我正在尋找一種便攜式的方式來做到這一點。 –

回答

0

也許whereis命令可以幫你嗎?

whereis -b -B `echo $PATH | sed 's/:/ /g'` -f [commands] 

例如我的電腦上,這個工程:

whereis -b -B `echo $PATH | sed 's/:/ /g'` -f find man fsc 

和結果:

whereis手冊頁
find: /usr/bin/find 
man: /usr/bin/man 
fsc: /opt/FSharp-2.0.0.0/bin/fsc.exe /opt/FSharp-2.0.0.0/bin/fsc 

警告:

Since whereis uses chdir(2V) to run faster, pathnames given 
    with the -M, -S, or -B must be full; that is, they must begin 
    with a `/'. 
+0

'whereis'在我的Solaris機器上似乎不可用,除非我添加/ usr/ucb軟件包。看起來編寫可移植腳本的最大竅門是理解可以使用哪些外部二進制文件的子集。 –

3

答案似乎是建立在 '類型' -在。

% /bin/sh 
$ type ls 
ls is /bin/ls 
+0

非常整齊的發現!你有時會說[命令]是否被散列?'$ type find find has hashed(/ usr/bin/find)' –

+0

我還沒有見過這樣的輸出。我確實在ksh中看到了這一點:ls是/ bin/ls的一個跟蹤別名。我只關心可能運行在/ bin/sh名下的shell的輸出。因爲這就是我在#上使用的東西!線。 –

相關問題