如何将Bash代码从test格式转换为if-fi格式?
如何将Bash代码从test格式转换为if-fi格式?
我来帮你搞定这个无限终端循环的问题!你遇到的核心问题是把判断逻辑搞反啦~
先拆解你原来的test风格代码的逻辑:
test "$IN_TERM" || { export IN_TERM=1 konsole -e "$0" exit 0 } && true
这段代码的意思是:如果IN_TERM变量为空或者未定义(test "$IN_TERM"会在变量为空时返回假,||表示“前面的命令失败就执行后面的代码块”),就执行大括号里的操作:设置IN_TERM=1,用konsole打开当前脚本,然后退出当前进程。如果IN_TERM已经存在(非空),就执行&& true(相当于啥也不做),继续脚本后续逻辑。
而你写的if-fi代码把判断条件搞反了:你用[[ -n $IN_TERM ]](判断变量非空)时去设置变量,else分支才打开终端——这就导致每次新启动的konsole进程里,IN_TERM还没被设置,会不断走进else分支,无限打开新终端。
正确的if-fi写法应该是这样的:
if [[ -z $IN_TERM ]]; then export IN_TERM=1 konsole -e "$0" exit 0 fi
这里用-z来判断IN_TERM是否为空(或未定义),如果满足条件,就执行设置变量、打开终端、退出的操作;如果IN_TERM已经被设置过(非空),就跳过这个if块,继续执行脚本后面的内容,完全还原了原来test代码的逻辑,不会再出现无限循环啦。
备注:内容来源于stack exchange,提问作者moninah
相关产品推荐
相关产品推荐

