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

时间:2016-11-22 17:00:01

标签: bash

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

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

有人可以解释一下这意味着什么吗?

所有这些符号使谷歌变得非常难,并且没有Haskell" hoogle"相当于bash所以我可以搜索符号表达式。

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

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";

3 个答案:

答案 0 :(得分:3)

  

有人可以解释一下这意味着什么吗?

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

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

    LESS = +' / ^ * OPTIONS'男子打击

      

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

    其中一个选项是-i。所以将bash称为bash -i …应该 [a] [a] shell中触发该选项。

    [a]我说应该,因为一些其他条件也需要有一个有效的交互式shell。此外,只需在终端中编写bash(未使用-i选项)

    即可启动交互式shell。

    [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的结构非常相似(在/etc/bash.bashrc中使用,并在基于debian的系统中在~/.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

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

答案 1 :(得分:2)

请参阅documentation for Bash variables

  

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

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

答案 2 :(得分:0)

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

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