2011-10-27 4 views

答えて

48

functionキーワードは、オプションです:

機能は、この構文を使用して宣言されています

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

このキーワードは* NON * -POSIXですか? – gavenkoa

+7

@gavenkoa [はい](http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29)。 'function'キーワードを使用する場合、Bash関数宣言はBourne/Korn/POSIXスクリプトと互換性がありません。 –

+0

Kornシェルでは、(スコープ付き変数はPOSIXではないので)関数を宣言する2つの方法の間で 'typedef'の変数の範囲に違いがあることに注意してください。 – cdarke

4

予約語functionはオプションです。 bash man pageの「シェル関数の定義」を参照してください。バッシュで関数を定義するときmanualに記載されているように

+0

は* NON *このキーワードです - POSIX? – gavenkoa

+1

@gavenkoaはい、そうです。 – tripleee

50

functionキーワードは、まれに必要です。それがなければ、バッシュは、関数定義を解析する前にエイリアスを展開する - おそらくないあなたが欲しいもの:意図したとおりに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. 

、物事は仕事:

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. 
関連する問題