【问题标题】:Need help understanding a strange bashrc expression需要帮助理解一个奇怪的 bashrc 表达式
【发布时间】: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,保持冷静并开始阅读。一切都在那里解释。

标签: 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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2023-04-11
      • 1970-01-01
      相关资源
      最近更新 更多