From d018734c0cc2c21c69926a5c85293c1dd6fb3b2b Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Wed, 20 Jan 2021 12:13:30 +0100 Subject: [PATCH] cmd: change suppress newline in echo command 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 Reviewed-by: Simon Glass --- cmd/echo.c | 51 +++++++++++++++++++-------------------------------- 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/cmd/echo.c b/cmd/echo.c index d02a4cfd58..fda844ee9d 100644 --- a/cmd/echo.c +++ b/cmd/echo.c @@ -10,47 +10,34 @@ static int do_echo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { - int i; - int putnl = 1; + int i = 1; + bool space = false; + bool newline = true; - for (i = 1; i < argc; i++) { - char *p = argv[i]; - char *nls; /* new-line suppression */ - - if (i > 1) - 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); + if (argc > 1) { + if (!strcmp(argv[1], "-n")) { + newline = false; + ++i; } } - if (putnl) + for (; i < argc; ++i) { + if (space) { + putc(' '); + } + puts(argv[i]); + space = true; + } + + 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" );