需要帮助理解一个奇怪的 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