echo foo | m4 -Dfoo=\`bar\' -Dbar=baz

On Mon, Oct 12, 2020 at 8:24 AM Eric Blake <ebl...@redhat.com> wrote:

> On 10/12/20 5:27 AM, Wolf wrote:
> > Hello,
> >
> > Not subscribed to the list, so please CC.
>
> That's standard practice anyway ;)
>
> >
> > I have m4 template that contains macro, that I do not know the value of
> > (provided by user). That can lead to user setting the macro to name of
> > another macro, like:
> >
> >       $ echo foo | m4 -Dfoo=bar -Dbar=baz
> >       baz
> >
> > Now, I understand why it happens and that it is expected. However, due
> > to reason stated above, I need the macro to expand just once, so that
> > the snippet above would produce `bar`. Is there a way to do so?
>
> In general, if the user is providing you text rather than something that
> should expand as a macro that needs further recursive interpretation,
> you should use defn() to get at that text:
>
> $ echo 'changequote([,])defn([foo])' | m4 -Dfoo=bar -Dbar=baz
> bar
>
> But keep in mind that defn does NOT perform any interpolation of $,
> which may introduce its own oddities if the user supplied a macro
> definition containing $ that you aren't expanding as a macro.
>
> --
> Eric Blake, Principal Software Engineer
> Red Hat, Inc.           +1-919-301-3226
> Virtualization:  qemu.org | libvirt.org
>
>
>

Reply via email to