cmd: change suppress newline in echo command
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Wed, 20 Jan 2021 11:13:30 +0000 (12:13 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Mon, 25 Jan 2021 00:15:33 +0000 (01:15 +0100)
By default the echo command emits its arguments followed by a line feed.

If any of the arguments contains the sub-string "\c", the line feed is
suppressed.

This does not match shells used in Linux and BSD where the first argument
has to be -n to suppress the line feed.

The hush shell interferes with the parsing of backslashes. E.g. in the
following command line quadruple backslashes are required for suppressing
the line feed:

for i in 1 2 3; do for j in 4 5; do echo \\\\c ${i}${j}; done; echo; done;

To avoid unexpected behavior the patch changes echo to use -n as first
argument to suppress the line feed.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
cmd/echo.c

index d02a4cf..fda844e 100644 (file)
 static int do_echo(struct cmd_tbl *cmdtp, int flag, int argc,
                   char *const argv[])
 {
-       int i;
-       int putnl = 1;
-
-       for (i = 1; i < argc; i++) {
-               char *p = argv[i];
-               char *nls; /* new-line suppression */
+       int i = 1;
+       bool space = false;
+       bool newline = true;
+
+       if (argc > 1) {
+               if (!strcmp(argv[1], "-n")) {
+                       newline = false;
+                       ++i;
+               }
+       }
 
-               if (i > 1)
+       for (; i < argc; ++i) {
+               if (space) {
                        putc(' ');
-
-               nls = strstr(p, "\\c");
-               if (nls) {
-                       char *prenls = p;
-
-                       putnl = 0;
-                       /*
-                        * be paranoid and guess that someone might
-                        * say \c more than once
-                        */
-                       while (nls) {
-                               *nls = '\0';
-                               puts(prenls);
-                               *nls = '\\';
-                               prenls = nls + 2;
-                               nls = strstr(prenls, "\\c");
-                       }
-                       puts(prenls);
-               } else {
-                       puts(p);
                }
+               puts(argv[i]);
+               space = true;
        }
 
-       if (putnl)
+       if (newline)
                putc('\n');
 
        return 0;
 }
 
 U_BOOT_CMD(
-       echo,   CONFIG_SYS_MAXARGS,     1,      do_echo,
+       echo, CONFIG_SYS_MAXARGS, 1, do_echo,
        "echo args to console",
-       "[args..]\n"
-       "    - echo args to console; \\c suppresses newline"
+       "[-n] [args..]\n"
+       "    - echo args to console; -n suppresses newline"
 );