summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinrich Schuchardt <xypron.glpk@gmx.de>2021-01-20 12:13:30 +0100
committerHeinrich Schuchardt <xypron.glpk@gmx.de>2021-01-25 01:15:33 +0100
commitd018734c0cc2c21c69926a5c85293c1dd6fb3b2b (patch)
treef4b75758df9f20140366eff8e64aa276ed6df6f4
parentde702493c449200a0e84c8e6dcc58deb49837691 (diff)
downloadu-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.c49
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"
);