web-dev-qa-db-ja.com

「f(){}」のようなbashシェルスクリプト関数定義で使用される括弧は何ですか? 「function」キーワードを使用するのとは異なりますか?

私はいつも彼らが何のために使われているのだろうと思っていましたか?中に何も入れられないのなら、毎回入れるのはばかげているようです。

function_name () {
    #statements
}

また、関数の先頭にfunctionキーワードを置くことで得たり失ったりするものはありますか?

function function_name () {
    #statements
}
37
Mint

キーワードfunctionは非推奨になり、移植性のためにfunction_name()が採用されました POSIX仕様

関数は、新しい位置パラメーターを使用して複合コマンドを呼び出すための単純なコマンドとして使用されるユーザー定義の名前です。関数は「関数定義コマンド」で定義されます。

関数定義コマンドの形式は次のとおりです。

fname() compound-command[io-redirect ...]

{ }は必須ではないため、キーワードfunctionを使用しない場合(使用しない場合)は、()が必要であるため、パーサーはあなたを認識します。関数を再定義します。

たとえば、これは正当な関数の定義と呼び出しです。

$ myfunc() for arg; do echo "$arg"; done; myfunc foo bar
foo
bar
50
SiegeX

最初の例では、bashがそれが関数定義であることを認識できるように、空の括弧が必要です(そうでない場合は、通常のコマンドのように見えます)。 2番目の例では、functionを使用したため、()はオプションです。

10
Greg Hewgill

functionがないと、エイリアスの展開は定義時に発生します。例えば。:

alias a=b
# Gets expanded to "b() { echo c; }" :
a() { echo c; }
b
# => c
# Gets expanded to b:
a
# => c

ただし、functionを使用すると、定義時にエイリアスの展開が行われないため、エイリアスは定義を「非表示」にします。

alias a=b
function a { echo c; }
b
# => command not found
# Gets expanded to b:
a
# => command not found
unalias a
a
# => c