linux shell #[感叹号]/bin/bash 是什么意思?
垃圾CSDN,標(biāo)題里感嘆號都發(fā)不出來!
文章目錄
- #!/bin/bash簡介
- 1)`#!/bin/bash`只能放在第一行,如果后面還有`#!`,那么只能看成是注釋。
- 2)#!后面的路徑一定要正確,不正確會(huì)報(bào)錯(cuò)。
- 3)如果一個(gè)腳本在第一行沒有加上`#!+shell路徑`這一行,那么,腳本會(huì)默認(rèn)當(dāng)前用戶登錄的shell,為腳本解釋器。
- 4)/bin/sh相當(dāng)于/bin/bash --posix
#!/bin/bash簡介
#!/bin/bash是指此腳本使用/bin/bash來解釋執(zhí)行。
其中,#!是一個(gè)特殊的表示符,其后,跟著解釋此腳本的shell路徑。
bash只是shell的一種,還有很多其它shell,如:sh,csh,ksh,tcsh,…
我們可以通過以下一個(gè)示例來進(jìn)行實(shí)驗(yàn),了解#!/bin/bash的使用。
1)#!/bin/bash只能放在第一行,如果后面還有#!,那么只能看成是注釋。
這里有三個(gè)腳本(腳本都要使用”chmod +x scriptname“命令來獲得可執(zhí)行權(quán)限,比如我喜歡直接chmod 777 * -R):
注:source命令簡介:關(guān)于Bash中的source命令
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í)行有問題時(shí),sh不再往下面執(zhí)行。(sh不可跳過有誤指令!)
[nsvc@localhost other]$ ./tbash2.sh ./tbash2.sh: line 2: abc: No such file or directory hello abc注:當(dāng)source命令執(zhí)行有問題時(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í)行有問題時(shí),bash繼續(xù)執(zhí)行下面命令。(bash可跳過有誤指令!)
如果將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也就是說,腳本忽略了第二行"#!/bin/sh",直接使用當(dāng)前所在的shell(也就是bash)來解釋腳本。
當(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í),并沒有往下執(zhí)行。說明,#!/bin/sh這一行起到作用了,但#!/bin/bash并沒有起作用。在腳本中,不在第一行的#!/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è)腳本在第一行沒有加上#!+shell路徑這一行,那么,腳本會(huì)默認(rèn)當(dāng)前用戶登錄的shell,為腳本解釋器。
在1)中,腳本tbash3.sh的執(zhí)行結(jié)果,就是用當(dāng)前自己登錄的shell(bash)解釋后的結(jié)果。我們通常所用的shell都是bash,如果哪天登錄到sh,再使用以上類型的腳本,就會(huì)有問題。以下是自己登錄到sh下,執(zhí)行tbash3.sh的結(jié)果:
-sh-3.2$ ./tbash3.sh ./tbash3.sh: line 1: abc: 沒有那個(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為示例。
source abc echo "hello abc"用以下命令來執(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"bash tbash3.sh"表示使用bash來作為腳本解釋器來執(zhí)行tbash3.sh。同樣,也可以使用如"sh 腳本名"這樣的命令,來用sh作為腳本解釋器。
從結(jié)果可以看出,/bin/bash --posix與/bin/sh的執(zhí)行結(jié)果相同。總結(jié)起來,sh跟bash的區(qū)別,實(shí)際上是bash有沒開啟posix模式的區(qū)別。遵守posix規(guī)范,可能包括,”當(dāng)某行代碼出錯(cuò)時(shí),不繼續(xù)往下執(zhí)行。“
最后加上一點(diǎn)說明,每個(gè)腳本開頭都使用"#!",#!實(shí)際上是一個(gè)2字節(jié)魔法數(shù)字,這是指定一個(gè)文件類型的特殊標(biāo)記,在這種情況下,指的就是一個(gè)可執(zhí)行的腳本。在#!之后,接一個(gè)路徑名,這個(gè)路徑名指定了一個(gè)解釋腳本命令的程序,這個(gè)程序可以是shell,程序語言或者任意一個(gè)通用程序。
總結(jié)起來,要規(guī)規(guī)舉舉地按照秩序行。
參考文章:#!/bin/bash
總結(jié)
以上是生活随笔為你收集整理的linux shell #[感叹号]/bin/bash 是什么意思?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMWare ubuntu虚拟机异常关闭
- 下一篇: Linux cat指令(用于连接文件并打