集册 Shell 十三问 () 与 {} 差在哪

() 与 {} 差在哪

—— () 与 {} 差在哪?

黑派客     最近更新时间:2020-08-04 05:37:59

106

嗯,这次轻松一下,不讲太多... ^_^

先说一下,为何要用 () 或者 {} 好了。

许多时候,我们在 shell 操作上,需要在 一定的条件下执行多个命令,也就是说, 要么不执行,要么就全执行,而不是每次 依序的判断是否要执行下一个命令。

或者,要从一些命令执行的先后次序中得到结果, 如算术运算的 2*(3+4) 那样...

这时候,我们就可以引入 "命令群组"(command group) 的概念:将许多命令集中处理。

在 shell command line中,一般人或许不太计较(){}这两对符号的差异,虽然两者都可以将多个命令当作群组处理, 但若从技术细节上,却是很不一样的:

  • ()command group置于sub-shell(子shell) 中去执行,也称 nested sub-shell
  • {} 则是在同一个shell内完成,也称non-named command group

若你对上一章的 fork 与 source 的概念还记得的话, 那就不难理解两者的差异了。

要是在 command group中扯上变量及其他环境的修改, 我们可以根据不同的需求来使用(){}。 通常而言, 若所作的修改是临时的,且不想影响原有或以后的设定, 那我们就使用nested sub-shell, 即(); 反之,则用non-named command group, 即{}

是的,光从command line来看,(){}差别就讲完了,够轻松吧~~~, ^_^

然而,这两个meta用在其他command meta或领域中 (如 Regular Expression), 还是有很多差别的。 只是,我不打算再去说明了,留给读者慢慢发掘好了...

我这里只想补充一个概念,就是function。 所谓function,就是用一个名字去命名一个command group, 然后再调用这个名字去执行command group

non-named command group来推断, 大概你也可以推测到我要说的是{}了吧?(yes! 你真聪明 ^_^)

在 bash 中,function 的定义方式有两种:

  • 方式一:
function function_name {
    command1
    command2
    command3
    .....
}
  • 方式二:
function_name () {
    command1
    command2
    command3
    ......
}

用哪一种方式无所谓, 只是碰到所定义的名称与现有的命令或者别名冲突的话, 方式二或许会失败。 但方式二起码可以少打个function这一串英文字符, 对懒人来说 (如我),有何乐而不为呢?...^_^

function 在一定程度上来说,也可以称为 "函数", 但请不要与传统编程所使用的 "函数"(library) 搞混了, 毕竟两者差异很大。 唯一相同的是,我们都可以随时用 "已定义的名称" 来调用它们...

若我们在 shell 操作中,需要不断地重复某些命令, 我们首先想到的,或许是将命令写成 shell 脚本 (shell script)。 不过,我们也可以写成 function, 然后在 command line 中打上 function_name 就可当一般的 shell script 使用了。

展开阅读全文