编写bash脚本时,如何获取当前文件所在位置的绝对路径?

dim*_*pol 20 command-line bash scripts paths

假设我有一个名为 .bash 的 bash 文件myBash.bash。它驻留在:

/myDirect/myFolder/myBash.bash
Run Code Online (Sandbox Code Playgroud)

现在我想在脚本中使用字符串/myDirect/myFolder(的位置myBash.bash)。有没有我可以用来找到这个位置的命令?

编辑:这个想法是我想设置一个 zip 文件夹,其中包含可以由该 zip 文件中的 bash 脚本启动的代码。我知道该 zip 文件中代码的相对文件路径,但不知道绝对路径,我需要这些。一种方法是在路径中进行硬编码,或者要求将文件的路径作为变量给出。但是,如果 bash 文件可以自行确定它的位置,然后根据其对 zip 文件结构的了解,创建到另一个文件的相关路径,我会发现它更容易。

Zan*_*nna 29

您可以获得完整路径,例如:

realpath "$0"
Run Code Online (Sandbox Code Playgroud)

正如Serg指出的,您可以dirname像这样去除文件名

dirname "$(realpath $0)"
Run Code Online (Sandbox Code Playgroud)

甚至更好地防止使用困难的文件名进行尴尬的引用和分词:

temp=$( realpath "$0"  ) && dirname "$temp"
Run Code Online (Sandbox Code Playgroud)

比我之前解析它的想法要好得多(我知道会有更好的方法!)

realpath "$0" | sed 's|\(.*\)/.*|\1|'
Run Code Online (Sandbox Code Playgroud)

笔记

  • realpath 返回文件的实际路径
  • $0 是这个文件吗(脚本)
  • s|old|new|替换oldnew
  • \(.*\)/之前保存任何字符/供以后使用
  • \1 保存的部分

  • @Serg `"$(dirname "$(realpath "$0")")"` 是最直接的方式。`$()` 中的引号正常工作。 (4认同)
  • +1 用于使用 `$0` 和 `sed` 魔法。但是当存在像“dirname”这样的工具时,所说的“sed”魔法真的没有必要 (2认同)
  • 你已经有了答案,使用`realpath`:`realpath "$( dirname $0 )"` 我个人会使用`readlink`,但这就是我:`readlink -e $(dirname $0)` (2认同)

小智 5

如果脚本在您的路径中,您可以使用类似的东西

$ myloc=$(dirname "$(which foo.sh)")
$ echo "$myloc"
/path/to/foo.sh
Run Code Online (Sandbox Code Playgroud)

编辑:在阅读了 Serg 的评论后,这可能是一个通用的解决方案,无论脚本是否在您的路径中都有效。

myloc==$(dirname "$(realpath $0)")
dirname "$myloc"
Run Code Online (Sandbox Code Playgroud)


ser*_*inc 5

接受的答案似乎很完美。这是另一种方法:

cd "$(dirname "$0")"
/bin/pwd
Run Code Online (Sandbox Code Playgroud)

/bin/pwd打印目录的真实路径,而不是pwd内置命令。