如何检测 bash 中是否正在引用文件

5

如何确定一个文件是否从bash中被引用?

这与这个问题非常相似,然而,没有任何一个提出的解决方案可行。例如,给定被引用的文件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个回答

5

使用$_可能存在错误,因为它仅表示上一条执行的命令的参数。

最好检查BASH_SOURCE,像这样:

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

BASH_SOURCE变量始终表示正在执行的脚本的名称,即使您不是在源代码中使用它。

另一方面,$0可以是脚本的名称,当您直接执行它时或者当您在其中引用它时等于-bash


0

当我运行你的示例时,仅使用你发布的代码,我无法重现这个问题。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接