我有一个脚本,当我想要它时不会退出。
具有相同错误的示例脚本是:
#!/bin/bash
function bla() {
return 1
}
bla || ( echo '1' ; exit 1 )
echo '2'
我假设看到输出:
:~$ ./test.sh
1
:~$
但我实际上看到了:
:~$ ./test.sh
1
2
:~$
()
命令链是否以某种方式创建作用域?什么是exit
退出了,如果不是脚本?
()
在子Shell中运行命令,因此exit
您将退出子Shell并返回到父Shell。{}
如果要在当前shell中运行命令,请使用花括号。
从bash手册:
(列表)列表在子shell环境中执行。在命令完成后,影响外壳环境的变量分配和内置命令将保持无效。返回状态是列表的退出状态。
{ 列表; } list仅在当前的shell环境中执行。列表必须以换行符或分号终止。这称为组命令。返回状态是列表的退出状态。请注意,与元字符(和)不同,{和}是保留字,并且必须出现在允许识别保留字的位置。由于它们不会造成单词中断,因此必须使用空格或其他shell元字符将它们与list分开。
值得一提的是,shell语法非常一致,并且子shell也参与了其他()
结构,例如命令替换(也使用旧式`..`
语法)或进程替换,因此以下内容也不会从当前shell退出:
echo $(exit)
cat <(exit)
当将命令显式放置在内部时()
,很可能会涉及到子外壳,但鲜为人知的事实是,它们也在以下其他结构中生成:
命令在后台启动
exit &
不会退出当前shell,因为(之后man bash
)
如果命令由控制操作符&终止,则外壳程序将在子外壳程序的后台执行该命令。外壳程序不等待命令完成,返回状态为0。
管道
exit | echo foo
仍然仅从子shell退出。
但是,不同的外壳在这方面的行为有所不同。例如bash
,将管道的所有组件放入单独的子外壳中(除非您lastpipe
在未启用作业控制的调用中使用该选项),而是将AT&Tksh
并zsh
在当前外壳中运行最后一部分(POSIX允许两种行为)。因此
exit | exit | exit
在bash中基本上不执行任何操作,但是由于last的 原因而从zsh退出exit
。
coproc exit
也可以exit
在子外壳中运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句