如何检测文件何时来自 bash

Cer*_*rin 5 linux bash shell

您如何确定文件是否来自 bash?

这与这个问题非常相似,但是,所提出的解决方案都不起作用。例如,给定源文件setup.bash

if [ "$_" == "$0" ]
then
    echo "Please source this script. Do not execute."
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

如果您使用以下方式获取它:/bin/bash -c ". ./setup.bash;"您将看到打印的消息“请获取此脚本。请勿执行。”。

为什么是这样?

我以这种方式获取文件,因为我的最终目标是执行依赖于该源文件的 bash 脚本,这意味着我最终想要做的是:

`/bin/bash -c ". ./setup.bash; some_command_that_relies_on_setup_dot_bash;"`
Run Code Online (Sandbox Code Playgroud)

如果我直接在 bash 中运行这些,例如:

. ./setup.bash
some_command_that_relies_on_setup_dot_bash
Run Code Online (Sandbox Code Playgroud)

源文件不显示消息。我究竟做错了什么?

anu*_*ava 5

使用$_可能容易出错,因为它仅代表上次执行命令的参数。

最好像BASH_SOURCE这样检查:

if [[ "$0" = "$BASH_SOURCE" ]]; then
    echo "Please source this script. Do not execute."
fi
Run Code Online (Sandbox Code Playgroud)

BASH_SOURCE变量始终代表正在执行的脚本的名称,./setup.sh即无论您是否采购它。

另一方面,$0当您直接执行脚本时可以是脚本的名称,或者可以等于-bash您输入脚本时的名称。