Eric Blake <ebl...@redhat.com> čálii: > On 11/04/2016 05:51 AM, Kevin Brubeck Unhammer wrote:
[...] >> C='' >> for i in "$@"; do >> i=$(echo "$i" | sed 's/\\/\\\\/g; s/\"/\\\"/g') >> C="$C \"$i\"" >> done >> echo "$C" > > That works (although we'd want to tweak it to not pollute outside the > autoconf namespace), but adds a number of forks to what is otherwise a > fork-free output of "$@". It's probably possible to optimize for the > common case of arguments that don't need shell quoting to reduce some of > the cost. Since both lib/autoconf/general.m4 and lib/autoconf/status.m4 > output an invocation line, it's probably worth factoring out a common > helper macro, probably to lib/m4sugar/m4sh.m4; would you like to try > your hand at a patch? If not, I can probably do it. I've tested the following to work under both dash and bash; and it only runs sed if the argument contains a ‘'’. #!/bin/sh C='' for i in "$@"; do case "$i" in *\'*) i=`printf "%s" "$i" | sed "s/'/'\"'\"'/g"` ;; *) : ;; esac C="$C '$i'" done printf " $0%s\n" "$C" I tested by making a script containing #!/bin/sh C='' for i in "$@"; do case "$i" in *\'*) echo 'fork!' >&2 i=`printf "%s" "$i" | sed "s/'/'\"'\"'/g"` ;; *) : ;; esac C="$C '$i'" done printf "%s\n" "$@" >/tmp/gold echo "Copy-paste this line, should give no output:" printf " printf \"%%s\\\n\" %s >/tmp/test; diff /tmp/gold /tmp/test\n" "$C" and running e.g. $ dash /tmp/esc.sh 'foo bar' 'x\"y' 'x\\"y' 'x\\\"y' 'x\\ \"y!' '!!' "foo'bar" and copy-pasting the output. Seems to hold … I don't know much about m4 though (and don't have much free time – but then who does), so maybe it's best if you turn that into a real patch, otherwise it's going to take quite a while :) best regards, Kevin Brubeck Unhammer
signature.asc
Description: PGP signature