bashスクリプトで関数名として「@」記号を使用できますか?以下は機能しません:
function @() {
echo hello
}
答え1
~からman bash
name A word consisting only of alphanumeric characters and underscores,
and beginning with an alphabetic character or an underscore. Also
referred to as an identifier.
Shell functions are declared as follows:
name () compound-command [redirection]
function name [()] compound-command [redirection]
答え2
編集2:@
バニラバッシュでは問題ないけど、extglob シェルオプション設定後は、echo @()
特定の条件でシェルを一時停止できます。その他の理由@
識別子として使用されない`。
編集1:明確にすると、識別子の定義によると、これは許可されません。私はそれをお勧めしません。私は以前のバージョンとの互換性のために話すだけです。可能bashの識別子として使用されます@
。
@() { echo "$1 world"; }
@ hello
alias @="echo hello"
@ world
@
特殊パラメータ($@
)と配列(${arr[@]}
)として使用されますが、他の場所では使用されません。 Bashは、エイリアスや関数などの識別子にそれを使用することを禁止しませんが、変数名にはそれを禁止しません。
一部の人々はエイリアスを使用して@
コマンドsudo
を@ apt-get install
。
私がこれをシェル識別子として使用しない主な理由@
は、私があまりにも慣れているからです。@
Makefileの意味副作用なしにコマンドを沈黙させます。
注:zshでも同じように機能します。
答え3
関数名は、エイリアスで許可される文字と非常によく似ています。
からman bash
:
/、$、 `、および=文字と上記のシェルメタ文字または引用符は、エイリアスには表示しないでください。
メタ文字
以下のいずれか:&; ()<>スペースタブ文字
したがって、以下は除外します。 / $ `= | &()<>スペースタブ
他のすべての文字は、別名と関数名に有効でなければなりません。
ただし、この文字はextglobが有効な場合にも@
使用されます。@(pattern-list)
デフォルトでは、extglobはインタラクティブシェルで有効になっています。
したがって、これは失敗するはずです。
$ @(){ echo "hello"; }
bash: syntax error near unexpected token `}'
しかしこれはうまくいきます:
$ bash -c '@(){ echo "hello"; }; @'
hello
これはまた働きます:
$ shopt -u extglob ### keep this as an independent line.
$ @(){ echo "hello"; }
$ @
hello
次のようにすることもできます。
$ f(){ echo "yes"; }
$ alias @=f
$ @
yes
エイリアスは、許容される記号が柔軟です。