執行 shell 腳本的不同方法
有幾種方法可以執行腳本。我認識的有:
/path/to/script # using the path (absolute or relative) . script # using the . (dot) source script # using the `source` command
還有其他方法嗎?它們之間有什麼區別?有沒有我必須使用一種而不是另一種的情況?
另一種方法是呼叫解釋器並將腳本的路徑傳遞給它:
/bin/sh /path/to/script
點和源是等價的。(編輯:不,它們不是:正如 KeithB 在對另一個答案的評論中指出的那樣,“。”僅適用於 bash 相關的外殼,其中“源”適用於 bash 和 csh 相關的外殼。)它執行腳本-place(就好像您在此處複製並粘貼腳本一樣)。這意味著腳本中的任何函式和非局部變數都會保留。這也意味著如果腳本將 cd 放入目錄中,完成後您仍然會在那裡。
執行腳本的其他方式將在它自己的子shell 中執行它。腳本中的變數在完成後仍然不存在。如果腳本改變了目錄,那麼它不會影響呼叫環境。
/path/to/script 和 /bin/sh 腳本略有不同。通常,腳本的開頭有一個“shebang”,如下所示:
#! /bin/bash
這是腳本解釋器的路徑。如果它指定的解釋器與您執行它時所做的不同,那麼它的行為可能會有所不同(或者可能根本不起作用)。
例如,Perl 腳本和 Ruby 腳本以(分別)開頭:
#! /bin/perl
和
#! /bin/ruby
如果您通過執行執行這些腳本之一
/bin/sh script
,那麼它們將根本不起作用。Ubuntu 實際上並沒有使用 bash shell,而是使用了一個非常相似的叫做 dash 的 shell。
/bin/sh script
由於您剛剛使用破折號解釋器呼叫了 bash 腳本,因此需要 bash 的腳本在通過 do 呼叫時可能會稍微出錯。直接呼叫腳本和將腳本路徑傳遞給解釋器的另一個小區別是腳本必須標記為可執行才能直接執行,而不是通過將路徑傳遞給解釋器來執行它。
另一個小的變化:您可以在這些方法中的任何一種前面加上 eval 來執行腳本,因此,您可以
eval sh script eval script eval . script
等等。它實際上並沒有改變任何東西,但我想我會為了徹底而包括它。