我想把所有常用的函数放在一个“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目录?
1条答案
按热度按时间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
添加到函数中将非常清楚地显示这一点。