2011-10-27 22 views

回答

48

function關鍵字是可選的,如在記錄的manual

函數是使用此語法宣稱:

name() compound-command [ redirections ]

function name [()] compound-command [ redirections ]

語法的第一種形式通常是首選,因爲它與Bourne/Korn/POSIX腳本兼容,因此更便於攜帶。
也就是說,有時您可能需要使用function關鍵字來防止Bash aliases與您的函數名稱發生衝突。考慮下面這個例子:

$ alias foo="echo hi" 
$ foo() { :; } 
bash: syntax error near unexpected token `(' 

這裏,'foo'由同名的別名的文本替換,因爲它是命令的第一個字。隨着function別名沒有展開:

$ function foo() { :; } 
+3

這是關鍵字*非* -POSIX? – gavenkoa

+7

@gavenkoa [是](http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29)。當使用'function'關鍵字時,Bash函數聲明與Bourne/Korn/POSIX腳本不兼容。 –

+0

請注意,在Korn shell中,在聲明函數的兩種方法(由於範圍變量不是POSIX)之間'typedef''變量的範圍有所不同。 – cdarke

4

保留字function是可選的。請參閱bash man page中的「殼體功能定義」部分。限定在擊的功能時

+0

這是關鍵字*非* - POSIX? – gavenkoa

+1

@gavenkoa是的。 – tripleee

50

function關鍵字是在罕見的情況下,必要時在函數名也是一個別名。沒有它,猛砸解析函數定義之前擴大了別名 - 可能不是你想要什麼:

alias mycd=cd 
mycd() { cd; ls; } # Alias expansion turns this into cd() { cd; ls; } 
mycd    # Fails. bash: mycd: command not found 
cd     # Uh oh, infinite recursion. 

隨着function關鍵字,事情工作打算:

alias mycd=cd 
function mycd() { cd; ls; } # Defines a function named mycd, as expected. 
cd       # OK, goes to $HOME. 
mycd       # OK, goes to $HOME. 
\mycd      # OK, goes to $HOME, lists directory contents. 
相關問題