哈嘍大家好,我是咸魚
不知道小伙伴們?cè)趯?Bash 腳本或者說看別人的 Bash 腳本的時(shí)候有沒有注意過腳本的第一行
#!/bin/bash
Bash 腳本的第一行往往以 #!
開頭,這一行稱作 shebang 行
在 類 UNIX 系統(tǒng)中,shebang 行用來指定腳本的解釋器路徑,通常出現(xiàn)在第一行,格式如下
#! interpreter_path
shebang 行中開頭 #!
字符的作用是告訴操作系統(tǒng)這不是一個(gè)普通二進(jìn)制文件,而是需要通過解釋器運(yùn)行的東西
而這個(gè)解釋器則通過 #!
字符后面來指定。例如 /bin/bash
表示使用 bash 解釋器來執(zhí)行該腳本文件
下面則是一些 Bash 腳本的 shebang 行,指定了不同的解釋器
#! /usr/bin/perl
#! /usr/bin/awk
#! /usr/bin/python
那么這時(shí)候小伙伴們可能就會(huì)有疑問:我忘了加 shebang 行,腳本為什么還能執(zhí)行?
如果一個(gè)腳本沒有添加 shebang 行來指定解釋器路徑,則默認(rèn)情況下系統(tǒng)會(huì)使用默認(rèn)的 shell 來執(zhí)行腳本,系統(tǒng)默認(rèn)的 shell 可以通過下面的命令來查看
# 一般情況下默認(rèn)的 shell 為bash
echo $SHELL
現(xiàn)在我們知道了 shebang 行的作用,那么我們現(xiàn)在來編寫一個(gè)腳本并修改 shebang 行試試
test.sh 內(nèi)容如下:
#!/bin/bash
echo Hello
先給 test.sh 腳本添加一下執(zhí)行權(quán)限
chmod +x test.sh
接下來我們用幾種方式來執(zhí)行這個(gè)腳本
可以看到腳本都成功執(zhí)行了
下面我們來改一下 shebang 行,將其改成其他命令
#!/usr/bin/ls -l
echo Hello
然后我們分別用幾種方式來執(zhí)行這個(gè)腳本
上面腳本執(zhí)行的結(jié)果是不是看的一臉懵逼,說實(shí)話我一開始看到的時(shí)候也是很懵
我們先來看下這四種腳本執(zhí)行方式的區(qū)別
- bash tesh.sh
這種方式執(zhí)行腳本的原理是將 test.sh 作為參數(shù)傳給 bash 解釋器(命令)來執(zhí)行,而不是 test,sh 自己來執(zhí)行
這種方式執(zhí)行腳本不需要給腳本文件添加執(zhí)行權(quán)限、不需要寫 shebang 行指定解釋器路徑,因?yàn)槟_本是作為參數(shù)被傳給 bash 來執(zhí)行
- sh test.sh
這種執(zhí)行腳本的方式跟上面的方式原理一樣,都是將腳本作為參數(shù)傳進(jìn)去,只不過是這個(gè)方式用的是 sh 解釋器(命令),而不是 bash
- /root/test.sh
這種是通過絕對(duì)路徑去執(zhí)行腳本,通過絕對(duì)路徑來執(zhí)行腳本就需要腳本擁有執(zhí)行權(quán)限
當(dāng)使用絕對(duì)路徑來執(zhí)行腳本時(shí),操作系統(tǒng)需要知道該腳本文件所使用的解釋器類型,這就需要依靠腳本文件中的 shebang 行
實(shí)際上你用絕對(duì)路徑執(zhí)行腳本的時(shí)候,如果里面定義了 shebang 行(例如 #! /bin/bash
)
那么實(shí)際上跟下面的命令是一樣的
/bin/bash /root/test.sh
在執(zhí)行腳本的時(shí)候,操作系統(tǒng)會(huì)讀取腳本的 shebang 行
如果你的 shebang 行是其他 Linux 命令而不是解釋器,那么就會(huì)導(dǎo)致操作系統(tǒng)將你的 shebang 行當(dāng)作命令,而你的腳本則是命令的參數(shù)
就好比上面的例子,我將 shebang 行改成了 #! /usr/bin/ls -l
,當(dāng)我執(zhí)行腳本的時(shí)候其實(shí)就是下面這樣的
/usr/bin/ls -l /root/test.sh
這樣會(huì)導(dǎo)致腳本無法執(zhí)行
- ./test.sh
這種是通過相對(duì)路徑去執(zhí)行腳本,跟上面用絕對(duì)路徑執(zhí)行腳本方式是一樣的,只不過區(qū)別是一個(gè)是相對(duì)路徑一個(gè)是絕對(duì)路徑文章來源:http://www.zghlxwxcb.cn/news/detail-435842.html
總結(jié):
- shebang 行通常出現(xiàn)在 UNIX 系統(tǒng)的腳本當(dāng)中,用來指定腳本的解釋器路徑,出現(xiàn)在第一行,以
#!
開頭 - 如果腳本里面沒有定義 shebang 行,系統(tǒng)會(huì)去找默認(rèn)的解釋器,默認(rèn)解釋器用
echo $SHELL
查看 - 用 bash 或者 sh 命令執(zhí)行腳本的時(shí)候,其實(shí)是把腳本作為參數(shù)傳給 bash 或 sh 命令了,這時(shí)候腳本可以不添加執(zhí)行權(quán)限、可以不需要 shebang 行
- 如果用絕對(duì)路徑或者相對(duì)路徑的方式來執(zhí)行腳本,需要腳本擁有執(zhí)行權(quán)限,如果 shebang 行定義的不是解釋器而是其他命令,就會(huì)導(dǎo)致腳本無法執(zhí)行
附上參考鏈接:Shebang Shenanigans :: Linus Karlsson文章來源地址http://www.zghlxwxcb.cn/news/detail-435842.html
到了這里,關(guān)于關(guān)于 Bash 腳本中 Shebang 的趣事的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!