#!/bin/bash是指此腳本使用/bin/bash來(lái)解釋執(zhí)行,。
其中,#!是一個(gè)特殊的表示符,,其后,,跟著解釋此腳本的shell路徑。
bash只是shell的一種,,還有很多其它shell,,如:sh,csh,ksh,tcsh,...
我們可以通過(guò)以下一個(gè)示例來(lái)進(jìn)行實(shí)驗(yàn),了解#!/bin/bash的使用,。
1)#!/bin/bash只能放在第一行,,如果后面還有#!,那么只能看成是注釋,。
這里有三個(gè)腳本(腳本都要使用”chmod +x
tbash1.sh:
#!/bin/sh
source abc
echo "hello abc"
tbash2.sh:
#!/bin/bash
source abc
echo "hello abc"
tbash3.sh:
source abc
echo "hello abc"
三個(gè)腳本執(zhí)行的結(jié)果:
[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 2: abc: No such file or directory
注:當(dāng)source命令執(zhí)行有問(wèn)題時(shí),,sh不再往下面執(zhí)行。
[nsvc@localhost other]$ ./tbash2.sh
./tbash2.sh: line 2: abc: No such file or directory
hello abc
注:當(dāng)source命令執(zhí)行有問(wèn)題時(shí),,bash繼續(xù)執(zhí)行下面命令,。
[nsvc@localhost other]$ ./tbash3.sh
./tbash3.sh: line 1: abc: No such file or directory
hello abc
注:自身登錄系統(tǒng)所在的shell是bash,。所以,當(dāng)source命令執(zhí)行有問(wèn)題時(shí),,bash繼續(xù)執(zhí)行下面命令,。
如果將tbash1.sh改成:
echo "abc"
#!/bin/sh
source abc
echo "hello abc"
那么,執(zhí)行結(jié)果是:
[nsvc@localhost other]$ ./tbash1.sh
abc
./tbash1.sh: line 3: abc: No such file or directory
hello abc
也就是說(shuō),,腳本忽略了第二行“#!/bin/sh",,直接使用當(dāng)前所在的shell(也就是bash)來(lái)解釋腳本。
當(dāng)把tbash1.sh改成:
#!/bin/sh
#!/bin/bash
source abc
echo "hello abc"
執(zhí)行結(jié)果為:
[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 3: abc: No such file or directory
當(dāng)執(zhí)行完source命令時(shí),,并沒(méi)有往下執(zhí)行,。說(shuō)明,#!/bin/sh這一行起到作用了,,但#!/bin/bash并沒(méi)有起作用,。在腳本中,不在第一行的#!/bin/bash,,只是一個(gè)注釋,。
2)#!后面的路徑一定要正確,不正確會(huì)報(bào)錯(cuò),。
假如,,我們把tbash1.sh中第一行的#!后面加了一個(gè)不存在的路徑”/home/sh“:
#!/home/sh
source abc
echo "hello abc"
執(zhí)行結(jié)果為:
[nsvc@localhost other]$ ./tbash1.sh
-bash: ./tbash1.sh: /home/sh: bad interpreter: No such file or
directory
系統(tǒng)會(huì)提示/home/sh的路徑不存在。
3)如果一個(gè)腳本在第一行沒(méi)有加上#!+shell路徑這一行,,那么,,腳本會(huì)默認(rèn)當(dāng)前用戶登錄的shell,,為腳本解釋器,。
在1)中,腳本tbash3.sh的執(zhí)行結(jié)果,,就是用當(dāng)前自己登錄的shell(bash)解釋后的結(jié)果,。我們通常所用的shell都是bash,如果哪天登錄到sh,,再使用以上類型的腳本,,就會(huì)有問(wèn)題。以下是自己登錄到sh下,,執(zhí)行tbash3.sh的結(jié)果:
-sh-3.2$ ./tbash3.sh
./tbash3.sh: line 1: abc: 沒(méi)有那個(gè)文件或目錄
與1)中的執(zhí)行結(jié)果是不一樣的,。
因此,大家應(yīng)該養(yǎng)成腳本首行加上#!+shell路徑的習(xí)慣,。
4)/bin/sh相當(dāng)于/bin/bash --posix
我們將腳本tbash1.sh改為:
#!/bin/bash --posix
source abc
echo "hello abc"
執(zhí)行結(jié)果:
[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 2: abc: No such file or directory
與tbash1.sh原腳本執(zhí)行的結(jié)果一樣,。
我們還可以以tbash3.sh為示例。
用以下命令來(lái)執(zhí)行該腳本:
[nsvc@localhost other]$ bash tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
hello abc
[nsvc@localhost other]$ sh tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
[nsvc@localhost other]$ bash --posix
tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
從結(jié)果可以看出,,/bin/bash
--posix與/bin/sh的執(zhí)行結(jié)果相同,。總結(jié)起來(lái),,sh跟bash的區(qū)別,,實(shí)際上是bash有沒(méi)開(kāi)啟posix模式的區(qū)別。遵守posix規(guī)范,,可能包括,,”當(dāng)某行代碼出錯(cuò)時(shí),不繼續(xù)往下執(zhí)行,?!?/div>
最后加上一點(diǎn)說(shuō)明,每個(gè)腳本開(kāi)頭都使用"#!",,#!實(shí)際上是一個(gè)2字節(jié)魔法數(shù)字,,這是指定一個(gè)文件類型的特殊標(biāo)記,在這種情況下,,指的就是一個(gè)可執(zhí)行的腳本,。在#!之后,接一個(gè)路徑名,,這個(gè)路徑名指定了一個(gè)解釋腳本命令的程序,,這個(gè)程序可以是shell,程序語(yǔ)言或者任意一個(gè)通用程序,。
總結(jié)起來(lái),,要規(guī)規(guī)舉舉地按照秩序行。
耶穌愛(ài)你,。
|
|