[systemd-devel] [PATCH 1/2] configure.ac: strip off trailing slashed from $rootprefix

Christian Seiler christian at iwakd.de
Sat May 30 03:31:30 PDT 2015


On 05/30/2015 10:28 AM, Daniel Mack wrote:
> On 05/30/2015 08:50 AM, Mike Gilbert wrote:
>> On Fri, May 29, 2015 at 8:05 PM, Daniel Mack <daniel at zonque.org> wrote:
>>> Make sure the variable set via --with-rootprefix= does not contain a
>>> trailing slash, so man pages can use entities like "&rootprefix;/lib"
>>> without ending up having double slashes.
>>> ---
>>>  configure.ac | 3 ++-
>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/configure.ac b/configure.ac
>>> index 92654a6..55b73de 100644
>>> --- a/configure.ac
>>> +++ b/configure.ac
>>> @@ -1396,7 +1396,8 @@ AC_ARG_WITH([zshcompletiondir],
>>>
>>>  AC_ARG_WITH([rootprefix],
>>>          AS_HELP_STRING([--with-rootprefix=DIR], [rootfs directory prefix for config files and kernel modules]),
>>> -        [], [with_rootprefix=${ac_default_prefix}])
>>> +        [with_rootprefix=`echo ${withval} | sed -e s,/*$,,`],
>>> +        [with_rootprefix=${ac_default_prefix}])
>>
>> Why do you pipe it through sed when a simple shell parameter expansion would do?
>>
>> with_rootprefix=${withval%/}
> 
> Isn't that's a bash'ism which we try to avoid at other places? FWIW, we
> use sed to strip off trailing dashes from $host for EFI_ARCH. Also, that
> one only replaces one trailing slash, not all of them.

No, it's not a bashism, it's indeed POSIX. See:
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_02

For example:

V="aXbXc"
printf '%s\n' "${V#*X}"
printf '%s\n' "${V##*X}"
printf '%s\n' "${V%X*}"
printf '%s\n' "${V%%X*}"

When using either one of bash, dash, ash, busybox's shell, mksh, pdksh
and zsh as /bin/sh, it all produces the same output:

bXc
c
aXb
a

The following are bashisms, however:

 - ${variable/pattern/subst}
 - ${!variable_variable}

Speaking of: using 'echo' for shell scripting is problematic, because
while bash, busybox's sh, mksh, pdksh and zsh don't interpret escape
sequences (\n, \0oo, ...) by default when using echo and invoked as
/bin/sh, dash and ash do. (Note that e.g. dash ist default on Debian,
so it's not like this is something theoretical.) Also, when invoked as
their proper name (not as /bin/sh), only bash and busybox's shell do
not interpret escape sequences by default with echo. (In short: it's a
mess.)

POSIX itself is ambivalent:

http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html
| or if any of the operands contain a backslash ( '\' ) character, the
| results are implementation-defined.

But it does recommend the behavior that ash and dash currently show
and NOT bash's behavior:

| The following character sequences shall be recognized on
| XSI-conformant systems within any of the arguments:
| [ list of escape sequences ]

The only portable way (not only to other UNIX systems, but also to
Linux systems with other shells) of printing things without
interpreting escape sequences is to use printf:

printf '%s\n' "$variable"

This is the same as ALL POSIX-compliant shells.

See also:
http://unix.stackexchange.com/questions/65803/why-is-printf-better-than-echo

Christian


More information about the systemd-devel mailing list