參考:
bash script-name或sh script-namepath/script-name或./script-namesource script-name或. script-name
(1)bash script-name或sh script-name
這是當指令碼檔案本身沒有可執行許可權(即檔案許可權屬性x位為-號)時常使用的方法(不管指令碼有無可執行許可權都可以通過這種方式執行),或者指令碼檔案開頭沒有指定直譯器時需要使用的方法(這種指令碼執行方式的bash或sh意思就是給指令碼指定了命令解釋程式,而指令碼中第一行的#!/bin/bash或#!/bin/sh與此作用相同)。推薦使用這種方法。
(2)path/script-name或./script-name
執行條件有二:指令碼檔案被賦予了執行許可權;指令碼檔案第一行指定了命令解釋程式(一般為#!/bin/bash)
注意:在生產環境中,運維人員由於忘記為該指令碼設定可執行許可權,然後直接使用,導致出錯。因此,推薦第一種 bashscript-name。
(3)source script-name或. script-name
source或者 「.」 命令的功能是:讀入指令碼並執行指令碼,即在當前shell中執行source或 「.」 載入並執行的相關指令碼檔案的命令及語句,而不是產生乙個子shell來執行檔案中的命令。
注意:這是和其他集中執行shell方式的最大不同。
舉個栗子:
新建乙個檔案test.sh,不給它賦予任何執行許可權
test.sh 內容如下
name=
"louzen"
echo
"set name to louzen"
這個指令碼檔案與常見的shell不同之處在於,這裡的檔案沒有賦予可執行許可權以及在檔案內容中的首行中沒有新增#!/bin/bash。
我們現在用上述介紹的幾種方式來測試下效果。
第一種:bash test.sh
可以執行指令碼內容,但是指令碼中設定的name變數卻輸出為空
name值是空的,是因為bash script-name 是產生了乙個子程序shell,而我們當前的操作還在父程序shell中,因此得不到name變數。
第二種:./test.sh
不能執行指令碼內容,賦予許可權後可以執行,但是name變數還是輸出為空
name為空,原因與第一種相同
第三種:source test.sh
test.sh 沒有執行許可權的情況下可以執行,並且成功輸出name的值
可以成功的輸出變數的值。這是因為source script-name和. script-name是將script-name中的內容直接載入到當前的shell,因此能夠輸出當前變數的值。
補充知識點:
乙個規範的shell指令碼在第一行會指出由哪個程式(直譯器)來執行指令碼中的內容,這一行內容在linux bash的程式設計一般為:
#!/bin/bash或#!/bin/sh
注意:
(1)在shell中如果一行如果以 「#!」 開頭,就是在指明命令解釋程式(直譯器),如果第一行僅以 「#」 開頭,就是乙個普通的注釋,除第一行之外的其他行,只要第乙個字元是 「#」 那就都是注釋。
(2)sh為bash的軟鏈結,大多數情況下,指令碼的開頭使用「#!/bin/bash」和「#!/bin/sh」是沒有區別的,但更規範的寫法是在指令碼的開頭使用「#!/bin/bash」。二者的區別是有沒有開啟posix模式,具體參考:
shell指令碼的三種執行方式
執行shell指令碼的三種方式有 1.sh test.sh 2.test.sh 3.source test.sh or test.sh 對於test.sh指令碼來說,如果沒有執行許可權或者沒有在檔案開頭指定直譯器,那麼只能使用第一種執行方式,除此之外,他們沒有什麼差別 但是對於第三種執行方式來說,它...
shell指令碼的三種呼叫方式
在執行shell指令碼時候,有三種方式來呼叫外部的指令碼,exec exec script.sh source source script.sh fork script.sh 1 exec exec home script.sh 使用exec來呼叫指令碼,被執行的指令碼會繼承當前shell的環境變數...
hive指令碼的三種執行方式
1.hive控制台執行,安裝了hive之後直接命令列輸入hive,進入控制台。2.hive e sql語句 直接輸入就會有結果,sql語句根據具體情況自己書寫 a.sql的內容如下 set mapred.job.queue.name default set hive.exec.reducers.ma...