Cのようにbashに名前空間を提供する方法はありますか?

Cのようにbashに名前空間を提供する方法はありますか?

私が言ったのは、Cではステートメントで名前空間を使用できることです。using namespace blah blah blahBashでも同じことができますか?

答え1

Cには名前空間はありませんが、C ++にはあります。しかし、Cではそうではありません。

いいえ、どちらにも名前空間はありませんbashbashローカル変数、関数、環境変数という3つの名前空間があります。したがって、変数と関数の両方を持つことができますfoofoo()しかし、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つ以上のコンピュータでスクリプトを作成するときに同じイディオムをたくさん繰り返すと、時間を大幅に節約できます。

関連情報