从shell脚本执行相对路径shell脚本

时间:2018-04-07 16:22:32

标签: bash

给出以下内容:

# a.sh

source ./stuff/b.sh

# b.sh

source ./c.sh

文件夹结构

- a.sh
- stuff
  - b.sh
  - c.sh

运行a.sh时,会出现错误./c.sh: No such file or directory

虽然我可以为c设置绝对路径,但我宁愿保持相对,因为脚本可以在多个位置运行。

有可能吗?

1 个答案:

答案 0 :(得分:2)

实现您想要的便携式解决方案包括将文件b.sh的内容替换为:

#!/usr/bin/env bash
# (file b.sh)

srcdir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )

source "$srcdir/c.sh"

作为旁注,请注意,可能没有必要来源文件:如果您需要在环境shell会话中导出c.sh中定义的变量,它尤其有用。否则(如果您只需要将c.sh作为独立脚本运行),您可能希望将上面的脚本替换为:

#!/usr/bin/env bash
# (file b.sh)

srcdir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )

"$srcdir/c.sh"

同时:

  • #!/usr/bin/env bash
  • 的开头添加shebang,例如#!/bin/bashc.sh
  • 通过执行c.sh
  • 设置chmod a+x c.sh的可执行位