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

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

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

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

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

答案1

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

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

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

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

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

    MYDIR="${MYSELF%/*}"

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

[编辑]:因为看起来并realpath没有什么优势readlink -f 迦勒建议,使用后者可能更好。我的计时测试表明它实际上更快。

答案2

realpath我的系统没有由 rozcietrzewiacz 建议

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

MYDIR="$(dirname "$(readlink -f "$0")")"

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

TEXTFILE="$(<$MYDIR/textfile)"

答案3

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

$ cat "$(dirname -- "$0")/textfile"

答案4

我正在尝试这些,但 realpath 对我不起作用。我采用的解决方案是:

SCRIPTDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )

到目前为止效果很好。我想知道该方法是否存在任何潜在问题。

相关内容