![在编写bash脚本时,如何获取当前文件位置的绝对路径?](https://linux22.com/image/1202115/%E5%9C%A8%E7%BC%96%E5%86%99bash%E8%84%9A%E6%9C%AC%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E6%96%87%E4%BB%B6%E4%BD%8D%E7%BD%AE%E7%9A%84%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84%EF%BC%9F.png)
假设我有一个名为的 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"