次のスニペットで説明されている状況を考慮すると、次のようになります。
# Input string provided as function argument:
input='base/{local,remote,other}$(echo hi)'
# Desired result from performing just brace expansion of the above:
expected=('base/local$(echo hi)' 'base/remote$(echo hi)' 'base/other$(echo hi)')
ZSHでこれを行う正しい方法は何ですか?ただ任意のカスタム入力文字列を中括弧で展開し、結果パラメータの配列を別の変数に保存しますか?値の中括弧拡張を強制的に見つけた唯一の方法は、eval
?を使用することです。だから私が要求することが可能かどうか疑問に思います。
いくつかの研究では、次のことがうまくいく可能性があることを示唆していますが、実際にはそうではないようです。
expanded=(${^input})
# Results in: expanded=('base/{local,remote,other}$(echo hi)')
答え1
他の形式の拡張ではなく、シェルコードで見つけることができるように拡張を実行するには演算子がないので、後を除くすべての項目を引用するのとeval
同じ方法を使用する必要があります。そして。{
}
,
たぶん、次のようなものがあります。
set -o extendedglob
eval "expanded=( ${input//(#m)[^{\},]##/${(qq)MATCH}} )"
(引用符があっても{1..5}
アクティブな場合..
のように、まだ拡張されているようです。)-
{a-f}
braceccl
a\{x,y}
上記はエスケープ、拡張を処理しませんa\x
a\y
と 。a"{x,y}"
a"x"
a"y"
注:bracexpand
このオプションが有効になっていて、noglob
このオプションが有効になっていない場合(mkshとksh93の最新バージョンのデフォルト)、kshは引用符で囲まれていない引数拡張またはコマンド置換に対して中括弧拡張を実行します。
ksh93の場合、ワイルドカードを無効にするもう1つの方法はに設定することですFIGNORE
。*
したがって、ksh93では次のことができます。
IFS= FIGNORE=*
expanded=( $input )
答え2
% x='{huh,what}'
% foo=( .(e:"reply=($x)":) )
% print -Rl $foo
huh
what
まあ、それはおそらくとても賢いようです。なぜなら、e
glob 評価者を乱用して (無視された) glob 結果を補間中括弧拡張で置き換えるからです。