如何检测文件何时从bash中获取

时间:2017-03-10 07:46:55

标签: linux bash shell

如何确定文件是否来自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

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

2 个答案:

答案 0 :(得分:1)

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

最好选择BASH_SOURCE,而不是这样:

if [[ "$0" = "$BASH_SOURCE" ]]; then
    echo "Please source this script. Do not execute."
fi

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

另一方面,$0可以是直接执行时的脚本名称,也可以是源代码时的-bash

答案 1 :(得分:0)

当我运行您的示例时,只是您发布的代码,我无法重现该问题。

但是:确保在检查之前不执行任何命令(或在变量中备份${_}since

  

_($ _,下划线。)在shell启动时,设置为用于调用在环境或参数列表中传递的正在执行的shell或shell脚本的绝对路径名。 随后,在扩展后扩展到上一个命令的最后一个参数。还设置为用于调用已执行并放置在导出到该命令的环境中的每个命令的完整路径名。检查邮件时,此参数保存邮件文件的名称。