1. 程式人生 > >Shell程式設計關於Sha-Bang(#!)的Q & A

Shell程式設計關於Sha-Bang(#!)的Q & A

Q. #!的名字為什麼叫Sha-Bang?

A. Sha-Bang是Sharp和Bang的組合詞。Sharp for #, Bang for ! 類似的情況是,C#通常被稱為C Sharp


Q. Sha-Bang(#!)是不是註釋?

A. 不是註釋。Sha-Bang(#!)所在行的作用是告知該指令碼使用的是哪種命令直譯器,並不是可有可無的。雖然很多情況下省略了Sha-Bang(#!)仍然能夠執行指令碼,這是由於系統在這種情況下是預設使用了當前命令列直譯器的


Q. Sha-Bang(#!)的編寫有什麼規範?

A. Sha-Bang(#!)應該位於指令碼的第一行,並且頂格填寫,否則都是錯的,即使Sha-Bang之前的內容都是註釋,這種錯誤是常見的,而且不易發現的,因為此時Sha-Bang(#!)所在行實際上是不起效的,系統使用了預設的命令列直譯器


Q. Sha-Bang(#!)在同一個指令碼中可以出現幾次?

A. 只有第一行的Sha-Bang(#!)會生效,其餘的會視為註釋


Q. 為什麼推薦這種寫法:#!/bin/env perl?

A. 因為這是有利於移植指令碼到其它平臺的寫法,直譯器的預設安裝路徑在各個作業系統是不太一樣的,有的是/bin/,有的是/usr/bin/,甚至有可能是使用者自定義的路徑,使用env就基本上能夠通用了。雖然env也有可能在/bin/或者/usr/bin/中,但通常的情況是在這兩個路徑下都有env,或者其中一個是另一個的符號連結


最後提醒一下,有時候設定的cronjob異常,但是命令列能夠執行成功,請先檢查一下Sha-Bang(#!)是否合法,然後檢查是否缺少了必須的環境變數,命令列能夠執行成功可能是利用了預設的命令列直譯器和環境變數。