background
你可能经常会在一个shell script file(.sh文件),或者一个写满shell scirpt的text文件的开头看到这样一行代码:
#! /bin/bash -xe
为什么要写这么一行代码? 不写可以吗? 写了有什么效果呢?
What is shell script?
shell script其实就是一组可以被一起执行的shell command,这个shell script可以被写在一个.sh
文件中,也可以被写在一个text文件中。
shell script需要被UNIX/UNIX-like sh
执行
,这里的sh就被称作command line interpreter(命令行翻译员)
。
What is shell?
shell是一个介于用户和OS之间的interface(接口),专门用来帮助用户访问操作系统。
What is sh、bash、zsh?
刚刚提到sh是解释器、是shell command的执行者,根据上图可以看出,shell中的功能基本是由sh实现的。
但是sh只是一种规范,定义了sh必须有的功能和规约。然而作为规范的sh必须就有真正的实现:
通常我们常见的/bin/sh
就是sh实现的软连接。
你可能也会经常看到/bin/bash
,看起来像是bash实现的软连接,那么bash是什么?
bash开始的时候其实是sh的一种实现,但是随着需求越来越多,bash中又加入很多sh中并没有包含的功能,甚至bash中有一些行为会更改sh中的需求。因此并不能完全的说bash是sh的实现。
当然zsh也是解释器,只不过是比bash功能更加强大的解释器。
#! /bin/bash
回到原题,经常出现在shell script file第一行的这段代码到底是什么意思呢?
根据上面介绍的context,这个文件中的shell script需要被sh解释执行,但是sh的实现有多种,那么像这样的一行代码,其实是在告诉操作系统,应该sh的哪一个实现来执行下面的script。
#! /bin/bash
#! /bin/sh
第一行是告诉操作系统,使用#! /bin/bash
,使用这个路径下的sh实现来执行下面的shell scirpt
第二行是告诉操作系统,使用#! /bin/sh
,使用这个路径下的sh实现来执行下面的shell scirpt
这第一行代码通常被称为hashbang
或shebang
#! /bin/bash -ex
我们知道了这行hashbang
的作用,那么参数是-ex
的作用是什么呢?
#! /bin/bash -ex
-e
: 如果shell command中的任何一行failed,整个shell script file的运行会在这个command处立刻终止。-x
: 在shell script的执行过程中,将command以及参数全部在标准输出中console出来
更多的sh参数,你可以使用bash -c "help set"
查阅