ubuntu 如何从bash中的源脚本获取源bash目录

qnyhuwrf  于 2023-04-20  发布在  其他
关注(0)|答案(1)|浏览(242)

我想把所有常用的函数放在一个“included_by_other_shell_script.sh“中,然后使用source命令调用它。

以下是sourcing脚本:/tmp/main/sourcing_test.sh

#!/bin/bash

source /tmp/sourced/included_by_other_shell_script.sh

echo "test_dir: $test_dir"

**以下是sourced脚本:/tmp/sourced/included_by_other_shell_script.sh

#!/bin/bash

get_bash_script_dir() {
    printf "%s" "${BASH_SOURCE[0]}"
}

test_dir="$(get_bash_script_dir)"

运行寻源测试:

/tmp/main/sourcing_test.sh

输出如下:

root@test:~# /tmp/main/sourcing_test.sh
test_dir: /tmp/sourced/included_by_other_shell_script.sh

预期输出如下:

root@test:~# /tmp/main/sourcing_test.sh
test_dir: /tmp/main

如何在公共函数“get_bash_script_dir()“中获取源代码bash目录?

bvjxkvbb

bvjxkvbb1#

使用"${BASH_SOURCE[-1]}""${BASH_SOURCE[2]}"代替"${BASH_SOURCE[0]}"
说明:BASH_SOURCE是一个数组,在当前调用堆栈中的每一层都有一个条目(source被视为函数调用)。因此在函数中:

  • ${BASH_SOURCE[0]}是“/tmp/sourced/included_by_other_shell_script.sh”中函数的源文件。
  • ${BASH_SOURCE[1]}是运行它的文件,在本例中,它是test_dir="$(get_bash_script_dir)"行的位置,它在同一个文件中。
  • ${BASH_SOURCE[2]}是运行 that 的文件。在本例中,它是source ...行的位置,位于“/tmp/main/sourcing_test.sh”中。

"${BASH_SOURCE[-1]}"将获取数组中的最后一个条目,这将是所有调用文件的父级,即主脚本。如果您知道函数将从其运行的确切上下文,您也可以使用例如"${BASH_SOURCE[2]}"来获取您想要的特定调用级别。
顺便说一句,将declare -p BASH_SOURCE >&2添加到函数中将非常清楚地显示这一点。

相关问题