2012-01-11 102 views

回答

30

如果腳本只定義了功能和沒有別的,你可以先使用source.命令當前shell的上下文中執行腳本,然後簡單地調用該函數。有關更多信息,請參閱help source

+0

此方法的唯一問題是,如果在函數中使用'exit',它將在執行函數後關閉終端。有沒有辦法解決? @SvenMarnach – user1527227 2014-09-02 23:01:42

+0

@ user1527227:在這種情況下,請與下一個答案一起去,因爲您已經掌握了shell腳本。如果你不這樣做,你可以先調用一個交互式子shell(只需輸入'bash'),'exit'只會終止子shell,而不是終端。 – 2014-09-03 10:09:27

15

以下命令第一寄存器中的上下文中的功能,則調用它:

. ./myScript.sh && func() 
6

簡言之,沒有。

您可以使用sourcehelp source瞭解詳情)將腳本中的所有功能導入到您的環境中,然後您可以將它們調用到您的環境中。這也有執行腳本的效果,所以要小心。

沒有辦法從shell腳本中調用函數,就像它是共享庫一樣。

+0

我認爲應該給予更多的權重作爲適當的答案。我試圖做類似於OP所需的東西,但shell腳本根本不是爲「clean-cut,OOP開發」(恕我直言)設計的。 – 2014-12-18 17:23:17

123

好吧,雖然其他答案是正確的 - 你當然可以做別的事情:如果你有權訪問bash腳本,你可以修改它,並簡單地在末尾放置特殊參數"[email protected]" - 將擴展到您指定的命令行的參數,並且由於它是「獨立的」,shell將嘗試逐字地調用它們;在這裏你可以指定函數名稱作爲第一個參數。例如:

$ cat test.sh 
testA() { 
    echo "TEST A $1"; 
} 

testB() { 
    echo "TEST B $2"; 
} 

"[email protected]" 


$ bash test.sh 
$ bash test.sh testA 
TEST A 
$ bash test.sh testA arg1 arg2 
TEST A arg1 
$ bash test.sh testB arg1 arg2 
TEST B arg2 

波蘭,你可以先驗證命令存在,並且是一個函數:

# Check if the function exists (bash specific) 
if declare -f "$1" > /dev/null 
then 
    # call arguments verbatim 
    "[email protected]" 
else 
    # Show a helpful error 
    echo "'$1' is not a known function name" >&2 
    exit 1 
fi 
+12

大多數情況下使用'「$ @」'。在某些情況下'$ @'不安全。 – fumiyas 2015-04-10 13:21:53

0

編輯:警告 - 好像這並不適用於所有情況,但效果很好許多公共腳本。

如果你有所謂的「控制」一個bash腳本和裏面你調用一個函數「建」:

function build() { 
    ... 
} 

然後,你可以這樣調用(從目錄中它在哪裏):

./control build 

如果它的另一個文件夾內,這將使它:

another_folder/control build 

如果你的文件我叫做「control.sh」,將作出相應的函數調用是這樣的:

./control.sh build 
0

我有一個情況我需要從bash腳本的功能,必須在此之前(例如執行通過source)和@$的問題是myScript.sh然後運行兩次,似乎...所以我想出了主意,讓功能不與SED:

sed -n "/^func()/,/^}/p" myScript.sh

而且在我需要時間來執行它,我把它放在一個文件,並使用source

sed -n "/^func()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh