関数を生成する関数を作成しようとしています。外部関数に渡された内容に基づいて、内部関数のパラメータを「ハードコーディング」したいと思います。例えば
outer() {
inner() { doSomething --context=$1 $@ }
}
上記の内容を参考に電話してください。
outer foo
内部関数を次のように定義したいと思います。
inner() { doSomething --context=foo $@ }
つまり、内部関数定義に外部関数の$ 1を挿入しますが、内部関数呼び出し時に挿入のために$ @を保持します。
この目標をどのように達成できますか?
編集する、私のユースケースが気になる人のために:
サブコマンドを含むコマンドラインツールを使用しています。例えば
doSomething dothis somearg
doSomething dothat
しかし、常にコンテキストフラグが必要です。例えば
doSomething --context foo dothis somearg
doSomething --context foo dothat
通常、コンテキストを入力すると、次のいくつかのコマンドは同じコンテキストを使用します。
したがって、理想的なソリューションを使用すると、コンテキストを一度設定し、コンテキストが既に知られているエイリアスのように内部関数を使用できます。
outer foo
inner dothis somearg
inner dothat
これは環境変数を介して行うこともできます。例えば
alias inner="doSomething --context=$CONTEXT"
しかし、実際には1つではなく2つのフラグがあります(これは現実的なパラメータを使用して)。
outer gke_gke-xpn-1_europe-west1_europe-west1-s41l stats_service
inner dothis somearg
inner dothat
—— (私にとって) —— よりユーザーフレンドリーです。
CONTEXT=gke_gke-xpn-1_europe-west1_europe-west1-s41l
NAMESPACE=stats_service
inner dothis somearg
inner dothat
ベストアンサー1
関数を生成する関数を作成しようとしています。外部関数に渡された内容に基づいて、内部関数のパラメータを「ハードコーディング」したいと思います。
あなたが望むものはクロージャですが、Bashにはそのようなクロージャがないと思います。
内部関数が実行される「コンテキスト」として別のグローバル変数を使用するだけです。例えば
context=
outer() {
context=$1
}
inner() {
if [ -z "$context" ]; then
echo "context not defined" >&2
return 1;
fi
doSomething --context="$context" "$@"
}
2つのコンテキスト変数が必要な場合は、別の変数を追加するだけです。
両方を引用し"$context"
、"$@"
スペースやワイルドカードを含む値が単語の分離によって破損していないことを確認する必要があります。