( ) 与 { } 差在哪?-- Shell十三问<第七问>

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

许多时候,我们在 shell 操作上,需要在一定条件下一次执行多个命令,也就是说,要么不执行,要么就全执行,而不是每次依序的判断是否要执行下一个命令。或是,需要从一些命令执行优先次顺中得到豁免,如算术的 2*(3+4) 那样...这时候,我们就可引入"命令群组"(command group)的概念:将多个命令集中处理。

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

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

    若是,你对上一章的 fork 与 source 的概念还记得了的话,那就不难理解两者的差异了。要是在 command group 中扯上变量及其它环境的修改,我们可以根据不同的需求来使用 ( )或 { } 。

通常而言,若所作的修改是临时的,且不想影响原有或以后的设定,那我们就 nested sub-shell,反之,则用 non-named command group 。

然而,若这两个 meta 用在其它 command meta 或领域中(如 Regular Expression),还是有很多差别的。

function概念

所谓的 function ,就是用一个名字去命名一个 command group ,然后再调用这个名字去执行 command group 。

从 non-named command group 来推断,大概你也可以猜到我要说的是 { } 了吧?

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

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

用哪一种方式无所谓,只是若碰到所定意的名称与现有的命令或别名(Alias)冲突的话,方式二或许会失败。但方式二起码可以少打 function 这一串英文字母。

function 在某一程度来说,也可称为"函式",但请不要与传统编程所使用的函式(library)搞混了,毕竟两者差异很大。惟一相同的是,我们都可以随时用"已定义的名称"来调用它们,若我们在 shell 操作中,需要不断的重复质行某些命令,我们首先想到的,或许是将命令

写成命令稿(shell script)。

不过,我们也可以写成 function ,然后在 command line 中打上 function_name 就可当一舨的 script 来使用了。

只是若你在 shell 中定义的 function ,除了可用 unset function_name 取消外,一旦退出 shell ,function 也跟着取消。

然而,在 script 中使用 function 却有许多好处,除了可以提高整体 script 的执行效能外(因为已被加载),还可以节省许多重复的代码.

简单而言,若你会将多个命令写成 script 以供调用的话,那,你可以将 function 看成是script 中的 script。

而且,透过上一章介绍的 source 命令,我们可以自行定义许许多多好用的 function ,再集中写在特定文件中,然后,在其它的script 中用 source 将它们加载并反复执行。

若你是 RedHat Linux 的使用者,或许,已经猜得出 /etc/rc.d/init.d/functions 这个文件什么作用了。

( ) 与 { } 差在哪?-- Shell十三问<第七问>的更多相关文章

  1. > 与 < 差在哪?-- Shell十三问<第十一问>

    > 与 < 差在哪?-- Shell十三问<第十一问> 谈到 I/O redirection ,不妨先让我们认识一下 File Descriptor (FD) .程序的运算,在 ...

  2. && 与 || 差在哪?-- Shell十三问<第十问>

    && 与 || 差在哪?-- Shell十三问<第十问> 好不容易,进入两位数的章节了... 一路走来,很辛苦吧?也很快乐吧? 在解答本章题目之前,先让我们了解一个概念:r ...

  3. $(( )) 与 $( ) 还有${ } 差在哪?-- Shell十三问<第八问>

    $(( )) 与 \(( ) 还有\){ } 差在哪?-- Shell十三问<第八问> 我们上一章介绍了 ( ) 与 { } 的不同,这次让我们扩展一下,看看更多的变化:$( ) 与 \( ...

  4. exec 跟 source 差在哪?-- Shell十三问<第六问>

    exec 跟 source 差在哪?-- Shell十三问<第六问> 这次先让我们从 CU Shell 版的一个实例贴子来谈起吧: 例中的提问是: cd /etc/aa/bb/cc 可以执 ...

  5. var=value?export前后差在哪?-- Shell十三问<第五问>

    var=value?export前后差在哪?-- Shell十三问<第五问> 这次让我们暂时丢开 command line ,先来了解一下 bash 变量(variable)吧.所谓的 变 ...

  6. " "( 双引号) 与 ' '( 单引号) 差在哪?-- Shell十三问<第四问>

    " "( 双引号) 与 ' '( 单引号) 差在哪?-- Shell十三问<第四问> 经过前面两章的学习,应该很清楚当你在 shell prompt 后面敲打键盘.直到 ...

  7. 别人 echo 、你也 echo ,是问 echo 知多少?-- Shell十三问<第三问>

    别人 echo .你也 echo ,是问 echo 知多少?-- Shell十三问<第三问> 承接上一章所介绍的 command line ,这里我们用 echo 这个命令加以进一步说明. ...

  8. [^ ] 跟 [! ] 差在哪?-- Shell十三问<第十四问>

    [^ ] 跟 [! ] 差在哪?-- Shell十三问<第十四问> 这道题目说穿了, 就是要探讨 Wildcard(通配符)与 Regular Expression(正则表达式)的差别的. ...

  9. shell十三问

    1) 为何叫做 shell ?在介绍 shell 是甚幺东西之前,不妨让我们重新检视使用者与计算机系统的关系:图(FIXME)我们知道计算机的运作不能离开硬件,但使用者却无法直接对硬件作驱动,硬件的驱 ...

随机推荐

  1. leetcode solution cracked tutorial

    leetcode solution cracked tutorial problemset https://leetcode.com/problemset/all/ Top Interview Que ...

  2. css 设置多行文本的行间距

    css 设置多行文本的行间距 block element span .ticket-card-info{ line-height:16px; display: inline-block; } .tic ...

  3. 2020 web developer roadmap

    2020 web developer roadmap https://github.com/kamranahmedse/developer-roadmap https://roadmap.sh/ ht ...

  4. TS & error

    TS & error Function implementation is missing or not immediately following the declaration.ts ht ...

  5. GoEasy使用阿里云OSS出现的问题

    前言:本人使用goeasy来实现微信小程序里面和其他人的im临时对话窗口,想要实现可以同时发送语音和视频.图片.表情包的话,就要通过goeasy关联到阿里云的存储对象. 报错:The OSS Acce ...

  6. 为什么说NGK引领全球数字资产财富革命

    进入2020年,区块链万业迸发出巨大的能量,事实上区块链和数字经济正是未来全球财富的新方向.区块链和数字货币的增值空间巨大,是数字时代新的经济增长点.目前,全球衍生品市场价值532万亿美元,全球债务市 ...

  7. 国内源安装ROS2

    资料参考: https://www.mscto.com/op/428870.html 需要修正的一点是,使用如下的命令添加源: sudo sh -c 'echo "deb [arch=$(d ...

  8. Java魔法类:Unsafe应用解析

    本文转载自Java魔法类:Unsafe应用解析 前言 Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别.不安全操作的方法,如直接访问系统内存资源.自主管理内存资源等,这些方法 ...

  9. XSS跨站脚本攻击(1)

    将跨站脚本攻击缩写为XSS,恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面的时候,嵌入其中的Web里面的Script代码就会被执行,从而达到恶意攻击用户的目的. 反射型XSS 反射 ...

  10. Elasticsearch--Logstash定时同步MySQL数据到Elasticsearch

    新地址体验:http://www.zhouhong.icu/post/139 一.Logstash介绍 Logstash是elastic技术栈中的一个技术.它是一个数据采集引擎,可以从数据库采集数据到 ...