这个问题在这里已有答案:
如何确定文件是否来自bash?
这与this question非常相似,但是,所提出的解决方案都不起作用。例如,给定源文件setup.bash
:
if [ "$_" == "$0" ]
then
echo "Please source this script. Do not execute."
exit 1
fi
如果您使用以下命令来源:/bin/bash -c ". ./setup.bash;"
,您将看到打印的消息“请输入此脚本。请勿执行。”。
为什么是这样?
我正在以这种方式获取文件,因为我的最终目标是执行依赖于此源文件的bash脚本,这意味着我最终想要这样做:
`/bin/bash -c ". ./setup.bash; some_command_that_relies_on_setup_dot_bash;"`
如果我直接在bash中运行这些,例如:
. ./setup.bash
some_command_that_relies_on_setup_dot_bash
源文件不显示该消息。我究竟做错了什么?
使用$_
可能容易出错,因为它只表示来自上次执行命令的参数。
最好像这样检查BASH_SOURCE
:
if [[ "$0" = "$BASH_SOURCE" ]]; then
echo "Please source this script. Do not execute."
fi
BASH_SOURCE
变量始终代表正在执行的脚本的名称,即./setup.sh
,无论您是否正在寻找它。
另一方面,当您直接执行时,$0
可以是脚本的名称,或者当您将其输入时,它可以等于-bash
。
当我运行您的示例时,只使用您发布的代码,我无法重现该问题。
但是:确保在检查之前不执行任何命令(或在变量中备份${_}
)since:
_($ _,下划线。)在shell启动时,设置为用于调用在环境或参数列表中传递的正在执行的shell或shell脚本的绝对路径名。随后,在扩展后扩展到上一个命令的最后一个参数。还设置为用于调用已执行并放置在导出到该命令的环境中的每个命令的完整路径名。检查邮件时,此参数保存邮件文件的名称。