bashで関数を定義するには以下の3つの記法がある。
関数名の後ろに()を付けるパターンとfunctionキーワードを頭に付けるパターン、それらの組み合わせパターンだ。
どれでも動くけど、これらの内のどれを使ったほうがいいんだろうか。
いくつかのシェルで試してみよう。
dashはそもそも"function"をキーワードとして扱っていない。
kshは"function 関数名"の後ろに"()"が出現することを予期していない。
だけであれば、いずれもうまくいいく。
どうも、歴史的経緯としてfunctionキーワードを導入したのはkshらしい。
bashは互換性を持たせるために"function 関数名"という記法を許した。
けど、そのときに"function 関数名()"もOKにしてしまったということなのかな。
シェルは先頭のトークンをコマンドもしくは制御用のキーワードとして解釈するという考え方からすれば、functionキーワードをを使って関数宣言するのはわからなくもない。
でも、互換性を考えると、functionキーワードを使わずに"関数名()"で関数宣言したほうがいいみたい。
# 関数名() func1() { echo 'func1' } # function 関数名 function func2 { echo 'func2' } # function 関数名() function func3() { echo 'func3' }
関数名の後ろに()を付けるパターンとfunctionキーワードを頭に付けるパターン、それらの組み合わせパターンだ。
どれでも動くけど、これらの内のどれを使ったほうがいいんだろうか。
いくつかのシェルで試してみよう。
$ cat func.sh func1() { echo 'func1' } function func2 { echo 'func2' } function func3() { echo 'func3' } func1 func2 func3 $ bash -version GNU bash, バージョン 4.2.53(1)-release (x86_64-suse-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. $ bash func.sh func1 func2 func3 $ bash --posix func.sh func1 func2 func3 $ #dashのバージョンを確認する方法がわからない... $ dash func.sh func.sh: 5: func.sh: function: not found func2 func.sh: 7: func.sh: Syntax error: "}" unexpected $ ksh --version version sh (AT&T Research) 93u+ 2012-08-01 $ ksh func.sh func.sh: line 5: syntax error at line 9: `(' unexpected $ pdksh -c 'echo $KSH_VERSION' @(#)PD KSH v5.2.14 99/07/13.2 $ pdksh func.sh func.sh[9]: syntax error: `(' unexpected
dashはそもそも"function"をキーワードとして扱っていない。
kshは"function 関数名"の後ろに"()"が出現することを予期していない。
func1() { echo 'func1' } func1
だけであれば、いずれもうまくいいく。
どうも、歴史的経緯としてfunctionキーワードを導入したのはkshらしい。
bashは互換性を持たせるために"function 関数名"という記法を許した。
けど、そのときに"function 関数名()"もOKにしてしまったということなのかな。
シェルは先頭のトークンをコマンドもしくは制御用のキーワードとして解釈するという考え方からすれば、functionキーワードをを使って関数宣言するのはわからなくもない。
でも、互換性を考えると、functionキーワードを使わずに"関数名()"で関数宣言したほうがいいみたい。
0 件のコメント:
コメントを投稿