【问题标题】:relative paths in nested shell scripts - I can only edit the calling script嵌套 shell 脚本中的相对路径 - 我只能编辑调用脚本
【发布时间】:2016-12-02 12:45:35
【问题描述】:

假设我有一个读取配置文件的 shell 脚本,其中包含一个相对路径作为参数 - 例如filePath=./file.txt

shell 脚本将其读入,当它自己运行./script.sh 时,它运行良好。

问题来了,当我有一个“菜单”脚本时,它可以调用script.sh。当我这样做时,使用. /absolute/path/to/script.sh,配置文件中的. 突然变得相对于menu.sh,而不是script.sh。即它现在在错误的目录中查找file.txt

我无法编辑script.sh 以采用绝对路径,并且配置文件也必须保持原样;所以我需要一种方法让menu.sh 调用script.sh 并让它像直接从bash 命令行调用一样 - 以便. 保持相对于script.sh 而不是相对于menu.sh 而它正在运行。

我最好怎么做?

【问题讨论】:

  • 使用当前工作目录解析相对路径,而不是正在执行的脚本的位置。 menu.sh 是否在某处执行 cd 命令来更改工作目录?
  • 相关,你的配置文件应该指定不依赖于使用它的脚本状态的绝对路径,或者至少提供一个显式的基本路径,脚本可以将相对路径连接到为了得到一个绝对路径。
  • @chepner 是的,我知道这是最理想的——但这不是它的做法,所以我没有太多选择!至于您的第一点,只需 cd-ing 到与脚本相同的文件路径就可以了?
  • 没有看到你的代码,我不知道怎么解决它。不过,我要指出的是,menu.sh 在尝试使用 $filePath 时对当前工作目录的概念与 script.sh 的概念不同;这就是你需要努力的地方。
  • 同意;但是menu.sh 没有使用$filepathscript.sh 是-但是script.sh 的行为就像$filepath 相对于menu.sh

标签: linux bash shell


【解决方案1】:

你正在这样做:

. /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 标头。

【讨论】:

  • 那么,您是否建议我在菜单脚本中设置本应在配置文件中设置的变量?那么它将与menu 脚本相关,对吧?这不是我想要的
  • 编辑(剧烈:))我的回答。抱歉,我真的读得太快了。
  • 用 commandOutput=$() 包围这个答案会导致它停止工作吗?我需要两组括号吗?
  • 嗯,好的,当我运行它时它可以工作 - 但它随后退出 menu.sh。有没有办法让它不这样做?内部script 正在调用end 0abend "false" 74(例如)
  • 那么您必须删除 . 前缀。就做result=$(cd /absolute/path/to;script.sh)
猜你喜欢
  • 2018-09-21
  • 2013-11-14
  • 2013-05-10
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多