2013-10-01 87 views
1

是否可以從任何目錄運行shell腳本,但是該腳本會保存其存儲位置的目錄上下文。從任何目錄運行腳本

例如:

/projects/a/bin/myscript.sh 

在項目/一個我有:

- app 
- code 
- tmp 
- bin 
    - myscript.sh 

MyScript可設置在工程應用和代碼目錄一些事情。

我希望能夠從任何地方運行安裝程序,即:

./bin/setup.sh 

或者直接在bin目錄:

./setup.sh 

但上下文似乎是從腳本運行在那裏拍攝而不是文件所在的位置。

+0

可能重複[可以Bash腳本告訴它存儲在什麼目錄?](http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored- in) –

回答

3

腳本的路徑可以在$0中找到。這包括腳本名稱本身,所以你需要做的是這樣

bin=$(dirname -- "$0") 

比你可以:

  • 簡單地參照其他腳本使用變量,如:

    . "$bin/utils.sh" 
    "$bin/../app/app" 
    

  • 進入目錄;但是這打破在命令行你有路徑,除非你讓他們絕對:

    cd "$bin" 
    

記得正確引用!

+0

+1。或者你可以cd到那個目錄並使用相對路徑:'cd - 「$(dirname - 」$ 0「)」' –

+0

@glennjackman:這就是當你將第一行和最後一行合併爲一個時,是。請記住,如果腳本接受任何文件名參數,用戶希望它們在運行腳本時相對於當前目錄,所以必須將它們更改爲絕對路徑('readlink -f'對此很有幫助,但它不是核心工具,並且不必到處安裝)如果您想更改腳本中的目錄。 –

0

可以拿到劇本目錄是這樣的:

SCRIPTDIR=`dirname "$0"` 

然後你就可以以有你的腳本的其餘部分運行,就好像它是從它的位置發起做

cd "$SCRIPTDIR" 

。您的位置不會被更改,只會執行腳本的位置。

或者,您可以在命令中簡單使用$SCRIPTDIR

+0

需要引用'「$ 0」'和'「$ SCRIPTDIR」' –

相關問題