Mailing List Archive

Single quotes and transport_filter
Chapter 24 documents the transport_filter option. An example is given
where the argv vector for the command comes from an expansion:

transport_filter = '/bin/cmd${if eq{$host}{a.b.c}{1}{2}}'

This runs the command /bin/cmd1 if the host name is a.b.c, and
/bin/cmd2 otherwise. If double quotes had been used, they would have
been stripped by Exim when it read the option’s value. When the
value is used, if the single quotes were missing, the line would be
split into two items, /bin/cmd${if and eq{$host}{a.b.c}{1}{2}, and
an error would occur when Exim tried to expand the first one.

I have two problems grokking this:

- I can find no other place in the spec where it is specifically
explained what single quotes do, as opposed to double quotes.

- In Section 29.3 on pipe commands (which are supposedly expanded the
same way), there is this example:

command = /some/path ${if eq{$local_part}{postmaster}{xx}{yy}}

will not work, because the expansion item gets split between
several arguments. You have to write

command = /some/path "${if eq{$local_part}{postmaster}{xx}{yy}}"

So why are double quotes OK here?

--
Ian

--
## List details at https://lists.exim.org/mailman/listinfo/exim-users
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://wiki.exim.org/
Re: Single quotes and transport_filter [ In reply to ]
On 19/03/2023 17:22, Ian Z via Exim-users wrote:
> Chapter 24 documents the transport_filter option. An example is given
> where the argv vector for the command comes from an expansion:
>
> transport_filter = '/bin/cmd${if eq{$host}{a.b.c}{1}{2}}'
>
> This runs the command /bin/cmd1 if the host name is a.b.c, and
> /bin/cmd2 otherwise. If double quotes had been used, they would have
> been stripped by Exim when it read the option’s value. When the
> value is used, if the single quotes were missing, the line would be
> split into two items, /bin/cmd${if and eq{$host}{a.b.c}{1}{2}, and
> an error would occur when Exim tried to expand the first one.
>
> I have two problems grokking this:
>
> - I can find no other place in the spec where it is specifically
> explained what single quotes do, as opposed to double quotes.

Yup; this could be better.

In the coding I find an explanatory comment:

/* Split the command up into arguments terminated by white space. Lose
trailing space at the start and end. Double-quoted arguments can contain \\ and
\" escapes and so can be handled by the standard function; single-quoted
arguments are verbatim. Copy each argument into a new string. */

>
> - In Section 29.3 on pipe commands (which are supposedly expanded the
> same way), there is this example:
>
> command = /some/path ${if eq{$local_part}{postmaster}{xx}{yy}}
>
> will not work, because the expansion item gets split between
> several arguments. You have to write
>
> command = /some/path "${if eq{$local_part}{postmaster}{xx}{yy}}"
>
> So why are double quotes OK here?

The difference is an artefact of the option-handling described in
Ch.6 Sec.17 :- if an option value *starts* with a doublequote
then it must end with one (and, implicitly, they get stripped
at that processing phase. The pipe example does not.

--
Cheers,
Jeremy


--
## List details at https://lists.exim.org/mailman/listinfo/exim-users
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://wiki.exim.org/