如何从脚本 A 调用脚本 B,就好像脚本 B 位于脚本 A 的位置一样

如何从脚本 A 调用脚本 B,就好像脚本 B 位于脚本 A 的位置一样

具体来说,脚本 B 与脚本 A 位于不同的位置。脚本 B 还会调用其他脚本。如果我从脚本 A 调用脚本 B,bash 会报告脚本 B 调用的脚本不存在。我该如何解决这个问题?

抱歉造成混淆。这是我的错。我将重写该问题如下:

文件系统层次结构为:

> $HOME
>     Script A
>     Folder2
>         Script B
>         Script C
>         Script D
>         ....

脚本C和D被B调用,如果我通过脚本A调用脚本B ./Folder2/B,会报错C和D不存在。

对于问题:

  1. 我使用 Ubuntu 20.04
  2. 和绝对路径无关,我把脚本A中的调用改为 和$HOME/Folder2/B/home/myName/Folder2/B结果是一样的。
  3. 不,所有内容都不在我的 $PATH 中
  4. 事情:#!/bin/bash
  5. 不,它们在它们应该在的地方并且是静态的。

答案1

我可能误解了你的意思,或者你的标题与问题不太相符。

听起来你有类似的东西:

$HOME/script1

#!/usr/bin/env bash
echo In $0
./Folder2/script2

$HOME/Folder2/script2

#!/usr/bin/env bash
echo In $0
./script3

$HOME/Folder2/script3

#!/usr/bin/env bash
echo In $0

正在执行:

> $HOME/script1

In /home/username/script1
In ./Folder2/script2
./Folder2/script2: line 3: ./script3: No such file or directory

在这种情况下,你的问题的标题实际上是正在发生。工作目录script2真的script1与( )相同$HOME,表示script3在工作目录中找不到script2

什么声音就像您想要的那样,让它script2始终像在 中一样运行Folder2,这样它就能找到同一目录中的其他脚本。

如果是这样,那么你可以只需更改目录即可script2

#!/usr/bin/env bash
echo In $0
cd "$(dirname "$(realpath "$0")")"
./script3.sh

但可能更好、更简洁的方法是将目录存储在变量中,并使用它来调用具有绝对路径的脚本:

script2

#!/usr/bin/env bash
echo In $0
SCRIPT_DIR="$(dirname "$(realpath "$0")")"
$SCRIPT_DIR/script3

相关内容