我有一个 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 建议的优势,因此使用后者可能更好。我的计时测试表明它实际上更快。
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)
您可以将其放在脚本的顶部:
cd "${BASH_SOURCE%/*}" || exit
Run Code Online (Sandbox Code Playgroud)
BASH_SOURCE 内部 bash 变量实际上是一个路径名数组。如果将其展开为一个简单的字符串,例如“$BASH_SOURCE”,您将获得第一个元素,它是当前正在执行的函数或脚本的路径名。
资料来源: http: //mywiki.wooledge.org/BashFAQ/028
| 归档时间: |
|
| 查看次数: |
33383 次 |
| 最近记录: |