シェルスクリプトを名前空間(好ましくは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
。各シェル変数には、デフォルトで少なくともデフォルトget
、set
およびメソッドを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!