![获取 bash 中的当前脚本位置(如 python __file__ 变量)](https://linux22.com/image/172971/%E8%8E%B7%E5%8F%96%20bash%20%E4%B8%AD%E7%9A%84%E5%BD%93%E5%89%8D%E8%84%9A%E6%9C%AC%E4%BD%8D%E7%BD%AE%EF%BC%88%E5%A6%82%20python%20__file__%20%E5%8F%98%E9%87%8F%EF%BC%89.png)
如何在 bash 中获取脚本的完整文件名? (类似于python的__file__
变量)
就像是
#!/bin/bash
# my-script.sh
# would evaluate to /dir/my-script.sh
thisfile=$(get-name-for-this-script)
# Do something with some other local file
cp $(dirname $thisfile)/something.txt .
答案1
在任何类似 sh 的 shell 中,$0
是执行脚本的路径。这在 bash 下有记录特殊参数。这可以是相对路径,在这种情况下,它是相对于 shell 启动时的当前目录的。
请注意,当一个脚本使用或$0
执行另一个脚本时,它不会改变。与 Python 的 更接近,它指示哪个文件包含当前正在执行的代码,是.
source
__file__
$BASH_SOURCE
。该手册在该主题上不是很清楚,但$BASH_SOURCE
它是包含当前执行行的文件的名称,即使对于不在函数中的代码也是如此。像$0
,$BASH_SOURCE
可以是相对路径:它是传递给.
内置命令的任何路径,并且如果 shell 运行后续cd
命令,则不会更改。
答案2
大多数答案要么不处理通过相对路径符号链接的文件,不是单行代码,要么不处理 BSD (Mac)。解决这三个问题的解决方案是:
HERE=$(cd "$(dirname "$BASH_SOURCE")"; cd -P "$(dirname "$(readlink "$BASH_SOURCE" || echo .)")"; pwd)
首先,cd 到bash 脚本目录的概念。然后 readlink 该文件以查看它是否是符号链接(相对或其他),如果是,则 cd 到该目录。如果没有,请 cd 到当前目录(必须保持简洁)。然后通过 回显当前目录pwd
。
您可以添加--
cd 和 readlink 的参数,以避免像选项这样命名的目录出现问题,但对于大多数用途,我不会打扰。
您可以在此处查看带有插图的完整说明(这是我的网站):
https://www.binaryphile.com/bash/2020/01/12/确定-the-location-of-your-script-in-bash.html