[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#32703: echo_man_error
From: |
Eric Blake |
Subject: |
bug#32703: echo_man_error |
Date: |
Tue, 11 Sep 2018 11:01:59 -0500 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.0 |
tag 32703 needinfo
thanks
On 9/11/18 6:32 AM, 1064240043 wrote:
In Manual page echo(1)
it says '-E disable interpretation of backslash escapes (default)'
but I tried and found out that enable(-e) is default.
What exactly did you try? And are you sure you are testing the same echo
in your various tests? Remember that many shells ship echo as a
built-in (both bash and dash, which are the two most common choices for
/bin/sh on a GNU/Linux installation), so you have to first determine
whether you are testing the behavior of your shell instead of the echo
built as part of coreutils (which is often installed at /bin/echo).
By the way, POSIX requires echo to behave with backslash escapes enabled
by default (dash does this, and bash can be convinced to do it via 'set
-o posix && shopt -s xpg_echo'). But oddly enough, coreutils does NOT
quite seem to obey POSIX, even under POSIXLY_CORRECT. Note:
$ /bin/echo --version | head -n1
echo (GNU coreutils) 8.29
$ POSIXLY_CORRECT=1 /bin/echo --version
--version
(so far, so good - printing --help/--version is a useful GNU extension,
but violates POSIX, so we turn it off under POSIXLY_CORRECT)
$ bash -c 'echo a\\nb'
a\nb
$ bash -c 'set -o posix; shopt -s xpg_echo; echo a\\nb'
a
b
$ dash -c 'echo a\\nb'
a
b
(okay, we've demonstrated that bash defaults to non-POSIX behavior, but
that it can be coerced into obeying; and dash defaults to POSIX behavior)
$ /bin/echo a\\nb
a\nb
(so far, so good - we've chosen to NOT expand backslash by default,
which matches bash's defaults even if it violates POSIX)
$ POSIXLY_CORRECT=1 /bin/echo a\\nb
a\nb
Yikes! Even though we asked for POSIX correctness, we are NOT
interpreting backslashes. I think this is a bug in GNU coreutils' echo,
and could be fixed by the patch below (but the testsuite would also need
updates).
But also note that POSIX has some rather wonky wording - it permits -n
to have implementation-defined behavior, but forgot to give special
exceptions to -e or -E. In short, the POSIX recommendation is that you
NEVER use 'echo' if you are trying to print a string that might start
with '-' or contain '\' - use printf instead.
diff --git i/src/echo.c w/src/echo.c
index 9958a8ec6..b3dfdb54a 100644
--- i/src/echo.c
+++ w/src/echo.c
@@ -189,7 +189,7 @@ main (int argc, char **argv)
just_echo:
- if (do_v9)
+ if (do_v9 || getenv ("POSIXLY_CORRECT"))
{
while (argc > 0)
{
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org
- bug#32703: echo_man_error, 1064240043, 2018/09/11
- bug#32703: echo_man_error,
Eric Blake <=
- bug#32703: echo_man_error, Eric Blake, 2018/09/11
- bug#32703: echo_man_error, Pádraig Brady, 2018/09/23
- bug#32703: echo_man_error, Eric Blake, 2018/09/24
- bug#32703: echo_man_error, Bernhard Voelker, 2018/09/24
- bug#32703: echo_man_error, Pádraig Brady, 2018/09/25
- bug#32703: echo_man_error, Eric Blake, 2018/09/24
- bug#32703: echo_man_error, Pádraig Brady, 2018/09/25