シェルネームスペース

シェルネームスペース

シェルスクリプトを名前空間(好ましくはbashシェルスクリプト)に入れる方法はありますかsource?しかし、他のシェルにこの機能があり、bashにはない場合は見てみましょう。

たとえば、名前の競合を防ぐために、「定義済みのシンボル(変数名、関数名、エイリアス)と競合しないように定義されたすべてのシンボルにプレフィックスを付けます」などがあります。

sourceどちらも名前空間(スタイル)を指定できるソリューションがある場合はNodeJS最善です。

サンプルコード:

$ echo 'hi(){ echo Hello, world; }' > english.sh
$ echo 'hi(){ echo Ahoj, světe; }' > czech.sh
$ . english.sh
$ hi
 #=> Hello, world
$ . czech.sh #bash doesn't even warn me that `hi` is being overwritten here
$ hi
 #=> Ahoj, světe
#Can't use the English hi now
#And sourcing the appropriate file before each invocation wouldn't be very efficient 

ベストアンサー1

man kshシステムで...ksh93

  • 名前空間
    • 変数を変更したり新しい変数を生成したりするコマンドのリストの一部として実行されるコマンドと関数は、名前が古い識別子によって指定された名前空間の名前であるnamespace新しい変数を生成します。.。 nameという変数を参照するときは、まず次のようにしてください。.identifier.name
    • 同様に、名前空間リストのコマンドで定義された関数は、で始まる名前空間名を使用して生成されます.
    • 名前空間コマンドリストにnamespaceコマンドが含まれている場合、生成された変数と関数の名前は変数または関数名で構成され、各名前の前には識別子のリストが続きます.。名前空間の外側では、名前空間名の前に名前を追加して、名前空間内で生成された変数または関数を参照できます。
    • デフォルトでは、.sh次から始まる変数はsh名前空間。

そして、説明のためにksh93シェルに割り当てられているすべての一般的なシェル変数に対してデフォルトで提供される名前空間に適用される概念は次のとおりです。次の例ではdiscipline.getこの関数はシェル変数に指定されたメソッドとして機能します$PS1。各シェル変数には、デフォルトで少なくともデフォルトgetsetおよびメソッドをappend含む独自の名前空間がありますunset。次の関数を定義した後、シェルで変数を参照するたびに、$PS1画面の上部に出力が描画されます。date

function PS1.get {
    printf "\0337\33[H\33[K%s\0338" "${ date; }"
}

()(また、上記のコマンド置換にはサブシェルがないことに注意してください)

技術的に言えば、名前空間そしてトピックいいえ正確に同じもの(なぜならトピック特定の項目にグローバルまたはローカルに適用するように定義できます。名前空間)しかし、どちらもシェルデータ型の概念化の重要な部分ですksh93

具体的な例を扱うには:

echo 'function hi { echo Ahoj, světe\!;  }' >  czech.ksh
echo 'function hi { echo Hello, World\!; }' >english.ksh
namespace english { . ./english.ksh; }
namespace czech   { . ./czech.ksh;   }
.english.hi; .czech.hi

Hello, World!
Ahoj, světe!

...または...

for ns in czech english
do  ".$ns.hi"
done

Ahoj, světe!
Hello, World!

おすすめ記事