diff options
author | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2021-01-20 12:13:30 +0100 |
---|---|---|
committer | Heinrich Schuchardt <xypron.glpk@gmx.de> | 2021-01-25 01:15:33 +0100 |
commit | d018734c0cc2c21c69926a5c85293c1dd6fb3b2b (patch) | |
tree | f4b75758df9f20140366eff8e64aa276ed6df6f4 | |
parent | de702493c449200a0e84c8e6dcc58deb49837691 (diff) | |
download | u-boot-d018734c0cc2c21c69926a5c85293c1dd6fb3b2b.tar.gz u-boot-d018734c0cc2c21c69926a5c85293c1dd6fb3b2b.tar.bz2 u-boot-d018734c0cc2c21c69926a5c85293c1dd6fb3b2b.zip |
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 <xypron.glpk@gmx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | cmd/echo.c | 49 |
1 files changed, 18 insertions, 31 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; - - 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" ); |