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


16

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

/myDirect/myFolder/myBash.bash

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

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


3
这可能更适合于stackoverflow。检查这些问题:stackoverflow.com/questions/4774054/... stackoverflow.com/questions/59895/...
Sethos II

1
使用方法。请澄清
Sergiy Kolodyazhnyy

1
@SethosII这个问题完全在这里讨论
Zanna

1
我在问题中添加了更多上下文。我认为可能有一个简单/显而易见的命令来获取正在执行的文件的文件路径,但是看来答案至少是显而易见的。
dimpol

3
@Zanna我不是说这是题外话,我认为它更合适,并且已经多次询问并回答了这些链接。
Sethos II

Answers:


24

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

realpath "$0"

正如Serg指出的那样,您可以使用这种dirname方式剥离文件名

dirname "$(realpath $0)"

甚至更好地防止难于引用的文件名和难于引用的单词:

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

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

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

笔记

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

2
+1使用$0sed魔法。但是,seddirname存在
诸如此类的

2
您已经有了答案,使用realpathrealpath "$( dirname $0 )"我个人会使用,readlink但是就是我:readlink -e $(dirname $0)
Sergiy Kolodyazhnyy

@Serg:会dirname "$(realpath "$0")"更好吗?通常,人们想知道所引用文件的父目录,而不是引用该文件的符号链接的父目录。
David Foerster

4
@Serg "$(dirname "$(realpath "$0")")"是最直接的方法。内部的引号$()正常工作。
DepressedDaniel

@DepressedDaniel在网上做了一些研究,您是对的:$()作为子外壳将允许在外部使用引号。我不会说这很简单,除非人们意识到$()所有的
子弹

5

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

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

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

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

which当脚本驻留在PATH变量之一的目录中时,它更适用。使用$0从脚本中,就像赞纳节目。但是您的答案是正确的,因为您使用dirname而不是弄乱sed,因此为此+1
Sergiy Kolodyazhnyy

5

公认的答案似乎是完美的。这是另一种方法:

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

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


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

它被视为从参考kenorb雄激素
不目录名,执行的readlink,真实路径,BASH_SOURCE
全部都内建

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.