web-dev-qa-db-ja.com

二重コロン「::」を含むBashスクリプト関数名

今日、二重コロン_::_を含む関数名が含まれているBashスクリプトに遭遇しました(例:file::write()file::read())。私はこれまでBashスクリプトでこの構文を見たことがありませんでした。スクリプトを呼び出したところ、(驚いたことに)正常に実行されました。

私のシステム(およびオンライン)でBashのマニュアルページを調べた後、この関数名の構文をサポートするドキュメントには何も見つかりません。たとえば、セクション_Shell Defined Functions_は、シェル関数の構文を次のように定義します

_function name [()] compound-command [redirection]
_

そして、(マニュアルの他の場所で)トークンnameは次のように定義されます

_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.
_

関数名の二重コロン構文のどこにも言及されていません。

これまでに見つけたこのダブルコロン構文への他の唯一の参照は、これにあります シェルスタイルガイド (サブセクション_Naming Conventions > Function Names_を参照)では、関数名にダブルコロン構文を使用することを推奨しています「パッケージ」-例:mypackage::myfunction()

この関数の二重コロン構文は、Bash Shellの正当な機能ですか、それとも文書化されていない機能ですか?正当な場合、Bashマニュアルのどこに記載されていますか?調べてみましたが、マニュアルでは何も見つかりません。私が見つけた最も近いものは、PATH環境変数で_::_を使用して、現在の作業ディレクトリを検索パスに追加することです。

[〜#〜]例[〜#〜]

_#!/bin/bash
function abc::def() {
    echo "${FUNCNAME[0]}"
}
abc::def
_

このスクリプトを3つの異なるLinuxディストリビューションでテストし、3つすべてのスクリプトで_abc::def_をstdoutに出力しました。

17
Jim Fischer

これは、おそらくフットガン係数を下げるために、実装よりもドキュメントが厳しい場合です。これは 前にここで説明しました です。 徹底的なテスト も参照してください。例:[}{は有効な関数名です。

また、abc::defは有効な変数名ではありません:

$ abc::def=foo
bash: abc::def=foo: command not found
16
l0b0