引用在 $PATH 中找到的脚本的同一目录下的文件

Tim*_*Tim 42 bash path

我有一个 bash 脚本文件,它放在添加到 $PATH 的某个目录下,以便我可以从任何目录调用脚本。

在与脚本相同的目录下还有另一个文本文件。我想知道如何引用脚本中的文本文件?

例如,如果脚本只是输出文本文件的内容,cat textfile则不起作用,因为从不同目录调用脚本时,找不到文本文件。

roz*_*acz 32

只要没有符号链接(在路径扩展或脚本本身中),这些应该相同:

  • MYDIR="$(dirname "$(realpath "$0")")"

  • MYDIR="$(dirname "$(which "$0")")"

  • 以上任何一个的两步版本:

    MYSELF="$(realpath "$0")"

    MYDIR="${MYSELF%/*}"

如果您的脚本途中有符号链接,which则将提供不包括该链接解析的答案。如果realpath您的系统上没有默认安装,您可以在这里找到它。

[编辑]:由于似乎realpath没有readlink -f Caleb 建议的优势,因此使用后者可能更好。我的计时测试表明它实际上更快。

  • `readlink -f` 似乎不适用于 Mac OS X 10.11.6,但 `realpath` 开箱即用。 (2认同)

Cal*_*leb 14

我的系统没有realpath如通过rozcietrzewiacz建议。

您可以使用该readlink命令完成此操作。与解析which或其他解决方案相比,使用它的优势在于,即使执行的路径或文件名的一部分是符号链接,您也可以找到实际文件所在的目录。

MYDIR="$(dirname "$(readlink -f "$0")")"
Run Code Online (Sandbox Code Playgroud)

然后可以将您的文本文件读入如下变量:

TEXTFILE="$(<$MYDIR/textfile)"
Run Code Online (Sandbox Code Playgroud)


Mic*_*zek 11

$0在脚本中将是脚本的完整路径,dirname并将采用完整路径并仅提供目录,因此您可以对 cat 文本文件执行此操作:

$ cat "$(dirname -- "$0")/textfile"
Run Code Online (Sandbox Code Playgroud)


Big*_*uge 5

您可以将其放在脚本的顶部:

cd "${BASH_SOURCE%/*}" || exit
Run Code Online (Sandbox Code Playgroud)

BASH_SOURCE 内部 bash 变量实际上是一个路径名数组。如果将其展开为一个简单的字符串,例如“$BASH_SOURCE”,您将获得第一个元素,它是当前正在执行的函数或脚本的路径名。

资料来源: http: //mywiki.wooledge.org/BashFAQ/028