需要帮助理解一个奇怪的 bashrc 表达式

Posted

技术标签:

【中文标题】需要帮助理解一个奇怪的 bashrc 表达式【英文标题】:Need help understanding a strange bashrc expression 【发布时间】:2017-04-06 11:10:45 【问题描述】:

我的 bashrc 文件中的第一件事是这个表达式:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

有人能解释一下这是什么意思吗?

所有这些符号都很难用 google 搜索,而且没有与 bash 等效的 Haskell “hoogle”,因此我可以搜索符号表达式。

预期的行为似乎与此类似。

nonsourced=0;

# if sourced,
if [[ "$0" == "$BASH_SOURCE" ]]; then
    nonsourced=1;
else
    nonsourced=0;
fi

echo "nonsourced? $nonsourced";


case $- in
    *i*) 
        # this case is entered if "$-" contains "i".
        if [[ "$nonsourced" -eq "0" ]]; then
            echo "1. " "$-";
        fi
        ;; # leave case?
    *) # this case is entered in all other cases.
        if [[ "$nonsourced" -eq "0" ]]; then
            echo "2. " "$-";
            return
        else
            # cannot return from nonsourced, use exit.
            echo "avoided return from nonsourced #2";
            exit 0;
        fi
        ;; # leave case?
esac

echo "3";

【问题讨论】:

*) 是“默认”,一个有趣的链接:linux.org/threads/case-statement-in-bash-scripts.5602(我搜索了“bash case asterisk”) 您可以尝试使用 symbolhound.com 搜索包含符号的字符串。 为什么需要谷歌?你不知道 bash 手册在哪里吗? gnu.org/software/bash/manual/html_node/index.html 从函数外部使用return不是无效吗?这部分代码在函数之外;它可能是来源,但假设这是错误的。 您无需搜索任何内容。在你的 shell 中输入man bash,保持冷静并开始阅读。一切都在那里解释。 【参考方案1】:

见documentation for Bash variables:

$-:连字符扩展为调用时指定的当前选项标志,由 set 内置命令或由 shell 本身设置的那些(例如 -i)。

案例模式中的星号是通配符,所以基本上整个案例都说“如果在参数中的某处有i [作为交互式],则继续,否则返回”。

【讨论】:

$- 选项如何设置/取消设置?它们不是参数,因为echo $-; 脚本总是说 hB。 我认为它是由 Bash 内部创建的,这可能也是为什么以如此简单的方式匹配 i 是安全的。我试图在源代码中找到正确的部分,但没有成功。 退货有效,因为它假设它是采购的,对吗? return 不能在源上下文/函数之外工作,并且它没有包装在函数中。【参考方案2】:

$- 列出了当前的 shell 选项。

这两种情况是-i 交互标志是否出现在该选项列表中的任何位置。

【讨论】:

【参考方案3】:

有人能解释一下这是什么意思吗?

$- 在评估时在 shell 中设置的选项列表。

当 shell (bash) 启动时,它接受一些选项:

LESS=+'/^ *OPTIONS' man bash

set 内置命令的描述中记录的所有单字符 shell 选项都可以在调用 shell 时用作选项。此外,bash 在调用时会解释以下选项:

其中一个选项是-i。因此,将 bash 称为 bash -i … 应该 [a][a] shell 内触发该选项。

[a] 我说应该,因为还需要一些其他条件才能拥有有效的交互式外壳。此外,可以通过在终端中简单地写入 bash 来启动交互式 shell(不使用 -i 选项)

[b] 打印一些已经设置好的选项的方式是echo $-

*i*) ;; 测试来自$- 的字符串是否包含i,如果是,则不执行任何操作。

*) return;;$- 的任何其他值上返回(退出脚本[c])。

[c] 请read this answer for return vs. exit.

总的来说,它按照评论所说的那样做:

# If not running interactively, don't do anything

或者用更清晰的措辞:

# If running interactively, exit[d].

[d] 使用 return 而不是 exit 在技术上可能更正确,但我相信这个想法更简洁。

请注意,$PS1 有一个非常相似的结构(例如,在基于 debian 的系统中,/etc/bash.bashrc 中使用并在 ~/.bashrc 中重复):

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

至于找符号的问题:

> all these symbols make it really hard to google

即使它没有涵盖这么多页面,SymbolHound 也可能在这里有所帮助。

If we try it

我们find this

这清楚地解释了您的要求。

【讨论】:

以上是关于需要帮助理解一个奇怪的 bashrc 表达式的主要内容,如果未能解决你的问题,请参考以下文章

有人可以帮助我更好地理解正则表达式中的零或一,并可能在同一个正则表达式语句中嵌套另一个

LeetCode开心刷题五十一天——118. Pascal's Triangle 接触跳转表概念,不知用处 lamda逗号导致表达式加法奇怪不理解119. Pascal's Trian

对ognl表达式的简单实现(Ognl.getValue(express,root)),帮助理解ognl表达式的基本原理

奇怪的表达式求值 (java实现)

网易2017春招笔试真题编程题集合——奇怪的表达式求值

需要帮助了解递归前缀评估器