假设我有一个读取配置文件的 shell 脚本,其中包含一个相对路径作为参数 - 例如filePath=./file.txt
shell脚本读入这个,自己运行./script.sh
时,运行正常。
问题来了,当我有一个可以调用 script.sh
的“菜单”脚本时。当我这样做时,使用 。/absolute/path/to/script.sh
,配置文件中的.
突然变成相对于menu.sh
,而不是script。嘘
。即它现在在错误的目录中查找 file.txt
。
我无法编辑 script.sh
来采用绝对路径,配置文件也必须保持原样;所以我需要一种方法让 menu.sh
调用 script.sh
并让它像直接从 bash 命令行调用一样 - 所以 .
在运行时相对于 script.sh
而不是相对于 menu.sh
。
我最好怎么做?
最佳答案
你正在这样做:
. /absolute/path/to/script.sh
如何做:
(cd /absolute/path/to;. script.sh)
它不是严格等效的,因为它创建了一个子 shell,并且在 script.sh
中创建/修改的所有变量都将在退出时丢失,但除此之外会执行您想要的操作。
要将命令的结果存储在变量中,只需执行以下操作:
result=$(cd /absolute/path/to;. script.sh)
编辑:源/点方法的问题在于,如果被调用的脚本退出,它会退出当前脚本。为避免这种情况(如果您不寻找副作用,只需替换为:
(cd /absolute/path/to;script.sh)
或
(cd /absolute/path/to;bash script.sh)
如果 script.sh
没有正确的 bash shebang header 。
关于linux - 嵌套 shell 脚本中的相对路径 - 我只能编辑调用脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40932565/