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

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

假设我有一个名为的 bash 文件myBash.bash。它位于:

/myDirect/myFolder/myBash.bash

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

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

答案1

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

realpath "$0"

并作为Serg 指出你可以dirname像这样删除文件名

dirname "$(realpath $0)"

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

temp=$( realpath "$0"  ) && dirname "$temp"

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

realpath "$0" | sed 's|\(.*\)/.*|\1|'

笔记

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

答案2

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

cd "$(dirname "$0")"
/bin/pwd

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

答案3

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

$ myloc=$(dirname "$(which foo.sh)")
$ echo "$myloc"
/path/to/foo.sh

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

myloc==$(dirname "$(realpath $0)")
dirname "$myloc"

答案4

wdir="$PWD"; [ "$PWD" = "/" ] && wdir=""
case "$0" in
  /*) scriptdir="${0}";;
  *) scriptdir="$wdir/${0#./}";;
esac
scriptdir="${scriptdir%/*}"
echo "$scriptdir"

参考自肯诺布安德罗
没有 dirname、readlink、realpath、BASH_SOURCE
都是内置的

相关内容