私が言ったのは、Cではステートメントで名前空間を使用できることです。using namespace blah blah blah
Bashでも同じことができますか?
答え1
Cには名前空間はありませんが、C ++にはあります。しかし、Cではそうではありません。
いいえ、どちらにも名前空間はありませんbash
。bash
ローカル変数、関数、環境変数という3つの名前空間があります。したがって、変数と関数の両方を持つことができますfoo
。foo()
しかし、2つの他のfoo()
機能ではありません。定義すると、2番目のものは常に最初のものよりも優先されます。
でbash
名前の競合を処理する必要がある場合の一般的な解決策は、ソース変数および/または関数にプレフィックスまたはサフィックスを提供することです。
答え2
いいえ、bash自体には名前空間はありません。ただし、source
このコマンドを使用すると、特定のスクリプトに選択的にインポートできるbashモジュールライブラリを構築できます。実際には、import
最新のプログラミング言語の構文をエミュレートする関数を書くことができます。
たとえば、次のようにできます。
#!/bin/bash
[[ -e "$HOME/libbash/core.sh" ]] && {
source "$HOME/libbash/core.sh"
}
include "string" # sources $HOME/libbash/string.sh
include "fs/msys" # sources $HOME/libbash/fs/msys.sh"
これは、〜/ libbashフォルダにcore.shと次のインポート定義が含まれると予想しています。
#!/bin/bash
#echo "${BASH_SOURCE[0]}"
LIBBASHDIR="$HOME/libbash"
import () {
for f in "$@"; do
if [[ -f "$LIBBASHDIR/$f.sh" ]]; then
source "$LIBBASHDIR/$f.sh"
else
echo >&2 "import: not found: '$f.sh'"
fi
done
}
スクリプトはあなたのシステムでのみ実行されます。これは、bashスクリプトの最も一般的なユースケースの1つである他の人のシステムで実行されるインストールスクリプトの作成に違反します。ただし、制御する1つ以上のコンピュータでスクリプトを作成するときに同じイディオムをたくさん繰り返すと、時間を大幅に節約できます。