获取 bash 中的当前脚本位置(如 python __file__ 变量)

获取 bash 中的当前脚本位置(如 python __file__ 变量)

如何在 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

相关内容