如何获取 sh 脚本自己的路径,即使是通过`.`

How to get sh script’s own path, even through `.`

我找到了不同的解决方案来获取 sh 脚本自己的路径,但其中 none 通过 . 在纯 POSIX sh 中工作。 我到目前为止的解决方案:

dirname $(readlink -f [=10=])

在 sh 中工作,但给出了父脚本的路径,因为 [=14=] 依赖于进程(见上文)

${BASH_SOURCE[0]}

这显然是一个仅 bash 的解决方案。

证明此解决方案不起作用:

$ tree --noreport
.
├── script1.sh
└── src
    └── script2.sh

$ cat script1.sh 
#!/bin/sh
. src/script2.sh

$ cat src/script2.sh 
#!/bin/sh
echo '[=12=] :' $(dirname $(readlink -f [=12=]))
echo '$BASH_SOURCE :' $BASH_SOURCE

$ sh script1.sh 
[=12=] : /tmp/sof
$BASH_SOURCE :

我可以在 script2.sh 中写什么以获得正确的 /tmp/sof/src 目录?

因为在 script1.sh 中找到 script2.sh 所在的目录几乎是不可能的,因此请尝试围绕它工作。你也可以在script1.sh里面找到script1的目录,你也知道script2.sh在script1里面的相对路径。然后,您可以在 script1.sh 中设置一个环境变量,指向 script2.sh 的目录,然后再获取它。然后你可以在script2.sh

中访问这个变量