2つのファイルがあるとしましょう。メインディレクトリそしてサブディレクトリ以下を含む同じフォルダに:
メイン.sh:
#!/usr/bin/env bash
export PARAMETER="main"
my_func(){
echo "$PARAMETER $1"
}
export -f my_func
# Run the other script
./sub.sh
サブ.sh:
#!/usr/bin/env bash
PARAMETER="sub"
my_func $PARAMETER
main.shを実行すると出力されますが、sub sub
私はそうしたいと思いますmain sub
。
main.shで定義された関数がmain.shによって開始されたスクリプトでそのパラメータ名の使用を制限することなく、常にmain.shで宣言された値を使用するようにする方法はありますか?私は実際の問題にsub.shに似た機能がたくさんあるので、sub.shを修正する必要がないソリューションを探しています。
編集:
私の質問に回答しましたが、いくつかの背景情報は次のとおりです。
main.sh
ドッカーイメージのエントリポイントスクリプトです。このエントリポイントは基本sub.sh
的に大きなケース説明であり、$1
スクリプトに重複したルーチンを再入力する必要がない
ようにユーティリティ関数を作成しようとしています。私はイメージにsub.shのようなスクリプトを追加する唯一の人ではないので、それに触れないようにします。他の開発者が知らなくてもツールを提供したいと思います。私の最初の考えは、その値を一意の名前を持つパラメータにコピーすることでした。これにより、機能が常に期待どおりに機能する可能性が高くなります。この時点で、パラメータが拡張関数をエクスポートできるかどうかを考えました。main.sh
sub.sh
PARAMETER
my_func_PARAMETER
答え1
あなたはできます作るパラメータが拡張された関数です。後で(グローバルまたはサブシェルで)オーバーライドできるため、「拡張パラメータを使用してエクスポート」できます。
#!/usr/bin/env bash
export PARAMETER="main"
eval "my_func(){
echo \"$PARAMETER \$1\"
}"
export -f my_func
# Run the other script
./sub.sh
または
#!/usr/bin/env bash
export PARAMETER="main"
my_func(){
echo "$PARAMETER $1"
}
export -f my_func
# Run the other script
(
eval "my_func(){
echo \"$PARAMETER \$1\"
}"
./sub.sh
)
明らかに、これはあまり意味がありません。変数の前の内容を使用するまで、変数は上書きされません。
#!/usr/bin/env bash
LOCAL_PARAMETER="sub"
my_func "$LOCAL_PARAMETER"