bash 関数名として「@」を使用します。

bash 関数名として「@」を使用します。

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

エイリアスは、許容される記号が柔軟です。

関連情報