我有一个 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 )
到目前为止效果很好。我想知道该方法是否存在任何潜在问题。