【问题标题】:Run script from any directory从任何目录运行脚本
【发布时间】:2013-10-01 12:15:45
【问题描述】:

是否可以从任何目录运行 shell 脚本,但脚本会保留其存储位置的目录上下文。

例如:

/projects/a/bin/myscript.sh

在我拥有的项目/a 中:

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

myscript 在项目应用和代码目录中设置一些东西。

我希望能够从任何地方运行设置,即:

./bin/setup.sh

或直接在 bin 目录中:

./setup.sh

但上下文似乎取自脚本运行的位置,而不是文件所在的位置。

【问题讨论】:

标签: linux bash shell ubuntu


【解决方案1】:

脚本的路径可以在$0 中找到。这包括脚本名称本身,因此您需要执行类似的操作

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

你可以:

  • 只需使用该变量引用其他脚本,例如:

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

    等等

  • 进入目录;但这会破坏您在命令行上获得的路径,除非您将它们设为绝对路径:

    cd "$bin"
    

记得正确引用!

【讨论】:

  • +1。或者您可以 cd 到该目录并从那里使用相对路径:cd -- "$(dirname -- "$0")"
  • @glennjackman:这就是将第一行和最后一行合并为一个的结果,是的。请记住,如果脚本采用任何文件名参数,则用户在运行脚本时希望它们相对于当前目录,因此您必须将它们更改为绝对路径(readlink -f 对此很好,但它是不是核心工具,不必到处安装),如果你想改变脚本内的目录。
【解决方案2】:

你可以像这样获取脚本目录:

SCRIPTDIR=`dirname "$0"`

那你就可以了

cd "$SCRIPTDIR"

为了让脚本的其余部分像从其位置启动一样运行。您的位置不会改变,只会改变执行脚本的位置。

或者,您可以在命令中简单地使用$SCRIPTDIR

【讨论】:

  • 需要引用"$0""$SCRIPTDIR"
猜你喜欢
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2023-01-30
  • 2011-06-11
相关资源
最近更新 更多