2013-10-01 94 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”' –

相关问题