パラメータをダッシュ(またはshまたは可能でない場合はbash)として引用したいと思います。"${(q+@)@}"
端末に入力したのと同じzshを使用してこれを実行できますreval <sth> ...
。<sth> ...
reval () {
eval "$(gquote "$@")"
}
gquote () {
print -r -- "${(q+@)@}"
}
答え1
for arg do
arg=$(printf '%s\n' "$arg" | sed "s/'/'\\\''/g")
set -- "$@" "'$arg'"
shift
done
eval "$@"
これにより、各位置パラメータの周囲に単一引用符が追加されます。ループは各位置引数を繰り返し、一重引用符を使用してリストの末尾に現在の位置引数を追加し、最初の(現在処理されている)要素を削除します。
埋め込まれた一重引用符は、リストの末尾に追加される'$arg'
前に文字列に置き換えられます$arg
。'\''
sed
次の関数でreval
:
reval () {
for arg do
arg=$(printf '%s\n' "$arg" | sed "s/'/'\\\''/g")
set -- "$@" "'$arg'"
shift
done
eval "$@"
}
(したがって、引数は末尾の改行を削除します。)
シェルでは、ループのbash
コマンド置換を呼び出してprintf
次に置き換えることができます。sed
arg=${arg//\'/\'\\\'\'}
利点は、末尾の改行が保存されることです。bash
シェルでもできますが、
reval () {
eval "${@@Q}"
}
...ここで、${variable@Q}
値は$variable
シェル入力に合うように引用されています。variable
beingの場合、@
これはすべての位置パラメータに適用されます。
${(q)@}
これはシェルから得られるものと似ていますzsh
。
reval () {
eval "${(q)@}"
}