linux - 嵌套 shell 脚本中的相对路径 - 我只能编辑调用脚本

标签 linux bash shell

假设我有一个读取配置文件的 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/

相关文章:

linux - BASH Base64 编码脚本编码不正确

linux - 如何在目录中找到最新的日期文件夹,然后在 shell 脚本中构造命令?

linux - 权限被拒绝尝试使用 openssl、sudo 从网站下载证书

c# - P/调用 dlopen 时的 SIGSEGV

linux - DNS 服务器在 QEMU 用户模式网络中不工作

linux - Shell 脚本命令输出与命令行输出不同

bash - 暂停 Bash 循环

ubuntu - SVN/Git/bash

linux - gmtset BASEMAP_FRAME_RGB 透明度

python - 是否可以构建一个适用于 Python 2 和 3 的shebang?