2013-12-08 211 views
4

我們現在使用dirname$0來查找shell腳本的目錄,但是當腳本包含在另一個腳本中時,這不起作用。如何在包含的shell腳本中查找腳本目錄

假設兩個文件first.shsecond.sh

/tmp/first.sh:

#!/bin/sh 
. "/tmp/test/second.sh" 

/tmp/test/second.sh:

通過
#!/bin/sh 
echo $0 

運行first.sh第二腳本還打印first.shsecond.sh中的代碼如何找到自己的目錄? (尋找一種適用於bash/csh/zsh的解決方案)

+0

我不認爲這是可能的。 – janos

+1

@janos:不,janos,有可能,看到我的回答 –

+0

@IgorChubin太棒了!我留下了這個評論,所以有人會回我;-) – janos

回答

3

沒有任何解決方案可以在所有類型的shell中起到同樣的作用。

bash你可以使用BASH_SOURCE

$(dirname "$BASH_SOURCE") 

例子:

$ cat /tmp/1.sh 
. /tmp/sub/2.sh 
$ cat /tmp/sub/2.sh 
echo $BASH_SOURCE 
$ bash /tmp/1.sh 
/tmp/sub/2.sh 

正如你所看到的,腳本打印的2.sh名稱, 雖然你開始/tmp/1.sh,包括2.shsource命令。

我必須注意,該解決方案僅適用於bash。在Bourne-shell(/bin/sh)中是不可能的。

在csh/tcsh/zsh中,您可以使用$_而不是BASH_SOURCE

+2

這是特定的bash。我提到的問題是,我正在尋找一種可以在bash/csh/zsh上運行的解決方案 –

+0

並且注意我使用了'/ bin/sh'作爲解釋器 –

+0

我在回答中已經注意到它只能在bash中工作。在bourne-shell中是不可能的。 –