Answers:
使用parens会将命令放在并非总是您想要的子外壳中。或者,使用花括号:
command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }
这里的窍门是,与括号不同,括号中的最终命令必须后跟;
。
大括号是命令的有效参数。例如,这里有一个花括号作为参数echo
:
$ echo }
}
因此,如果外壳看到:
{ command1; command2 }
Shell将command1解释为没有参数,而将command2解释为只有一个由字符组成的参数}
。花括号}
仅在分号或换行符之后才被解释为结束分组。要进行上述工作:
{ command1; command2; }
{...}
和(...)
观察到以下设置x
为10,但是在echo
命令运行之前忘记了该设置:
$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0
相比之下,使用花括号x=10
可以记住的设置:
$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10
区别在于,子外壳程序完成后,子外壳程序中的变量分配无法继续存在。
来自man bash
:
(清单)
list是在子shell环境中执行的(请参阅下面的COMMAND EXECUTION ENVIRONMENT)。在命令完成后,影响外壳环境的变量分配和内置命令将保持无效。返回状态是列表的退出状态。
{清单; }
list仅在当前的shell环境中执行。 列表必须以换行符或分号终止。 这称为组命令。返回状态是列表的退出状态。请注意,与元字符(和)不同,{和}是保留字,并且必须出现在允许识别保留字的位置。由于它们不会造成单词中断,因此必须使用空格或其他Shell元字符将它们与list分开。
[强调已添加]
()
和{}
。