具体来说,脚本 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不存在。
对于问题:
- 我使用 Ubuntu 20.04
- 和绝对路径无关,我把脚本A中的调用改为 和
$HOME/Folder2/B
,/home/myName/Folder2/B
结果是一样的。 - 不,所有内容都不在我的 $PATH 中
- 事情:#!/bin/bash
- 不,它们在它们应该在的地方并且是静态的。
答案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