background
你可能經(jīng)常會(huì)在一個(gè)shell script file(.sh文件)淤年,或者一個(gè)寫滿shell scirpt的text文件的開頭看到這樣一行代碼:
#! /bin/bash -xe
為什么要寫這么一行代碼屎暇? 不寫可以嗎趋急? 寫了有什么效果呢瞻鹏?
What is shell script?
shell script其實(shí)就是一組可以被一起執(zhí)行的shell command互躬,這個(gè)shell script可以被寫在一個(gè).sh
文件中,也可以被寫在一個(gè)text文件中脐往。
shell script需要被UNIX/UNIX-like sh
執(zhí)行
,這里的sh就被稱作command line interpreter(命令行翻譯員)
扳埂。
What is shell?
shell是一個(gè)介于用戶和OS之間的interface(接口)业簿,專門用來幫助用戶訪問操作系統(tǒng)。
What is sh聂喇、bash辖源、zsh?
剛剛提到sh是解釋器蔚携、是shell command的執(zhí)行者希太,根據(jù)上圖可以看出,shell中的功能基本是由sh實(shí)現(xiàn)的酝蜒。
但是sh只是一種規(guī)范誊辉,定義了sh必須有的功能和規(guī)約。然而作為規(guī)范的sh必須就有真正的實(shí)現(xiàn):
通常我們常見的/bin/sh
就是sh實(shí)現(xiàn)的軟連接亡脑。
你可能也會(huì)經(jīng)扯槌危看到/bin/bash
,看起來像是bash實(shí)現(xiàn)的軟連接霉咨,那么bash是什么蛙紫?
bash開始的時(shí)候其實(shí)是sh的一種實(shí)現(xiàn),但是隨著需求越來越多途戒,bash中又加入很多sh中并沒有包含的功能坑傅,甚至bash中有一些行為會(huì)更改sh中的需求。因此并不能完全的說bash是sh的實(shí)現(xiàn)喷斋。
當(dāng)然zsh也是解釋器唁毒,只不過是比bash功能更加強(qiáng)大的解釋器。
#! /bin/bash
回到原題星爪,經(jīng)常出現(xiàn)在shell script file第一行的這段代碼到底是什么意思呢浆西?
根據(jù)上面介紹的context,這個(gè)文件中的shell script需要被sh解釋執(zhí)行顽腾,但是sh的實(shí)現(xiàn)有多種近零,那么像這樣的一行代碼,其實(shí)是在告訴操作系統(tǒng)抄肖,應(yīng)該sh的哪一個(gè)實(shí)現(xiàn)來執(zhí)行下面的script秒赤。
#! /bin/bash
#! /bin/sh
第一行是告訴操作系統(tǒng),使用#! /bin/bash
憎瘸,使用這個(gè)路徑下的sh實(shí)現(xiàn)來執(zhí)行下面的shell scirpt
第二行是告訴操作系統(tǒng)入篮,使用#! /bin/sh
,使用這個(gè)路徑下的sh實(shí)現(xiàn)來執(zhí)行下面的shell scirpt
這第一行代碼通常被稱為hashbang
或shebang
#! /bin/bash -ex
我們知道了這行hashbang
的作用幌甘,那么參數(shù)是-ex
的作用是什么呢潮售?
#! /bin/bash -ex
-e
: 如果shell command中的任何一行failed痊项,整個(gè)shell script file的運(yùn)行會(huì)在這個(gè)command處立刻終止。-x
: 在shell script的執(zhí)行過程中酥诽,將command以及參數(shù)全部在標(biāo)準(zhǔn)輸出中console出來
更多的sh參數(shù)鞍泉,你可以使用bash -c "help set"
查閱