我的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";
答案 0 :(得分:3)
有人可以解释一下这意味着什么吗?
$-
评估点在shell中设置的选项列表。
当shell(bash)启动时,它接受一些选项:
LESS = +' / ^ * OPTIONS'男子打击
set builtin命令描述中记录的所有单字符shell选项都可以在调用shell时用作选项。此外,bash在调用时会解释以下选项:
其中一个选项是-i
。所以将bash称为bash -i …
应该 [a] 在 [a] shell中触发该选项。
[a]我说应该,因为一些其他条件也需要有一个有效的交互式shell。此外,只需在终端中编写bash
(未使用-i
选项)
[b]打印已设置的某些选项的方法是使用echo $-
*i*) ;;
测试来自$-
的字符串是否包含i
,如果是,则不执行任何操作。
*) return;;
关于$-
返回的任何其他值(转出脚本 [c] )。
总的来说,它符合评论所说的内容:
# 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
也可能对此有所帮助。
这清楚地解释了你的要求。
答案 1 :(得分:2)
请参阅documentation for Bash variables:
$-
:连字符扩展为调用时指定的当前选项标志,set内置命令或shell本身设置的那些(例如-i)。
案例模式中的星号是通配符,所以基本上整个案例都说“如果参数中有某个i
[作为交互式”,请继续,否则返回“。
答案 2 :(得分:0)
$-
列出了当前的shell选项。
这两种情况是-i
交互标志是否出现在该选项列表中的任何位置。