blob: f4738264ce5e35b9f1032923a909903f7915dcac [file] [log] [blame]
Jari Aalto726f6381996-08-26 18:22:31 +00001This file is echo.def, from which is created echo.c.
2It implements the builtin "echo" in Bash.
3
Jari Aalto31859422009-01-12 13:36:28 +00004Copyright (C) 1987-2009 Free Software Foundation, Inc.
Jari Aalto726f6381996-08-26 18:22:31 +00005
6This file is part of GNU Bash, the Bourne Again SHell.
7
Jari Aalto31859422009-01-12 13:36:28 +00008Bash is free software: you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
Jari Aalto726f6381996-08-26 18:22:31 +000012
Jari Aalto31859422009-01-12 13:36:28 +000013Bash is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
Jari Aalto726f6381996-08-26 18:22:31 +000017
Jari Aalto31859422009-01-12 13:36:28 +000018You should have received a copy of the GNU General Public License
19along with Bash. If not, see <http://www.gnu.org/licenses/>.
Jari Aalto726f6381996-08-26 18:22:31 +000020
21$PRODUCES echo.c
Jari Aaltoccc6cda1996-12-23 17:02:34 +000022#include <config.h>
23
24#if defined (HAVE_UNISTD_H)
25# include <unistd.h>
26#endif
27
Jari Aaltod166f041997-06-05 14:59:13 +000028#include "../bashansi.h"
29
Jari Aalto726f6381996-08-26 18:22:31 +000030#include <stdio.h>
31#include "../shell.h"
32
Jari Aalto06285672006-10-10 14:15:34 +000033#include "common.h"
34
Jari Aalto726f6381996-08-26 18:22:31 +000035$BUILTIN echo
36$FUNCTION echo_builtin
37$DEPENDS_ON V9_ECHO
38$SHORT_DOC echo [-neE] [arg ...]
Jari Aalto31859422009-01-12 13:36:28 +000039Write arguments to the standard output.
Jari Aalto726f6381996-08-26 18:22:31 +000040
Chet Rameyac50fba2014-02-26 09:36:43 -050041Display the ARGs, separated by a single space character and followed by a
42newline, on the standard output.
Jari Aalto31859422009-01-12 13:36:28 +000043
44Options:
45 -n do not append a newline
46 -e enable interpretation of the following backslash escapes
47 -E explicitly suppress interpretation of backslash escapes
48
49`echo' interprets the following backslash-escaped characters:
50 \a alert (bell)
51 \b backspace
52 \c suppress further output
53 \e escape character
Chet Rameyac50fba2014-02-26 09:36:43 -050054 \E escape character
Jari Aalto31859422009-01-12 13:36:28 +000055 \f form feed
56 \n new line
57 \r carriage return
58 \t horizontal tab
59 \v vertical tab
60 \\ backslash
61 \0nnn the character whose ASCII code is NNN (octal). NNN can be
62 0 to 3 octal digits
63 \xHH the eight-bit character whose value is HH (hexadecimal). HH
64 can be one or two hex digits
65
66Exit Status:
67Returns success unless a write error occurs.
Jari Aalto726f6381996-08-26 18:22:31 +000068$END
69
70$BUILTIN echo
71$FUNCTION echo_builtin
72$DEPENDS_ON !V9_ECHO
73$SHORT_DOC echo [-n] [arg ...]
Jari Aalto31859422009-01-12 13:36:28 +000074Write arguments to the standard output.
75
76Display the ARGs on the standard output followed by a newline.
77
78Options:
79 -n do not append a newline
80
81Exit Status:
82Returns success unless a write error occurs.
Jari Aalto726f6381996-08-26 18:22:31 +000083$END
84
85#if defined (V9_ECHO)
86# define VALID_ECHO_OPTIONS "neE"
87#else /* !V9_ECHO */
88# define VALID_ECHO_OPTIONS "n"
89#endif /* !V9_ECHO */
90
Jari Aaltobb706242000-03-17 21:46:59 +000091/* System V machines already have a /bin/sh with a v9 behaviour. We
92 give Bash the identical behaviour for these machines so that the
93 existing system shells won't barf. Regrettably, the SUS v2 has
94 standardized the Sys V echo behavior. This variable is external
95 so that we can have a `shopt' variable to control it at runtime. */
Jari Aalto95732b42005-12-07 14:08:12 +000096#if defined (DEFAULT_ECHO_TO_XPG) || defined (STRICT_POSIX)
Jari Aaltobb706242000-03-17 21:46:59 +000097int xpg_echo = 1;
98#else
99int xpg_echo = 0;
100#endif /* DEFAULT_ECHO_TO_XPG */
101
Jari Aalto95732b42005-12-07 14:08:12 +0000102extern int posixly_correct;
103
Jari Aalto726f6381996-08-26 18:22:31 +0000104/* Print the words in LIST to standard output. If the first word is
105 `-n', then don't print a trailing newline. We also support the
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000106 echo syntax from Version 9 Unix systems. */
107int
Jari Aalto726f6381996-08-26 18:22:31 +0000108echo_builtin (list)
109 WORD_LIST *list;
110{
Jari Aaltod166f041997-06-05 14:59:13 +0000111 int display_return, do_v9, i, len;
112 char *temp, *s;
Jari Aalto726f6381996-08-26 18:22:31 +0000113
Jari Aaltobb706242000-03-17 21:46:59 +0000114 do_v9 = xpg_echo;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000115 display_return = 1;
Jari Aalto726f6381996-08-26 18:22:31 +0000116
Jari Aalto95732b42005-12-07 14:08:12 +0000117 if (posixly_correct && xpg_echo)
118 goto just_echo;
119
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000120 for (; list && (temp = list->word->word) && *temp == '-'; list = list->next)
121 {
Jari Aalto726f6381996-08-26 18:22:31 +0000122 /* If it appears that we are handling options, then make sure that
123 all of the options specified are actually valid. Otherwise, the
124 string should just be echoed. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000125 temp++;
Jari Aalto726f6381996-08-26 18:22:31 +0000126
127 for (i = 0; temp[i]; i++)
128 {
129 if (strchr (VALID_ECHO_OPTIONS, temp[i]) == 0)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000130 break;
Jari Aalto726f6381996-08-26 18:22:31 +0000131 }
132
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000133 /* echo - and echo -<nonopt> both mean to just echo the arguments. */
134 if (*temp == 0 || temp[i])
135 break;
Jari Aalto726f6381996-08-26 18:22:31 +0000136
137 /* All of the options in TEMP are valid options to ECHO.
138 Handle them. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000139 while (i = *temp++)
Jari Aalto726f6381996-08-26 18:22:31 +0000140 {
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000141 switch (i)
142 {
143 case 'n':
144 display_return = 0;
145 break;
Jari Aalto726f6381996-08-26 18:22:31 +0000146#if defined (V9_ECHO)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000147 case 'e':
148 do_v9 = 1;
149 break;
150 case 'E':
151 do_v9 = 0;
152 break;
Jari Aalto726f6381996-08-26 18:22:31 +0000153#endif /* V9_ECHO */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000154 default:
155 goto just_echo; /* XXX */
156 }
Jari Aalto726f6381996-08-26 18:22:31 +0000157 }
Jari Aalto726f6381996-08-26 18:22:31 +0000158 }
159
160just_echo:
161
Jari Aaltob80f6442004-07-27 13:29:18 +0000162 clearerr (stdout); /* clear error before writing and testing success */
163
Jari Aalto31859422009-01-12 13:36:28 +0000164 terminate_immediately++;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000165 while (list)
Jari Aalto726f6381996-08-26 18:22:31 +0000166 {
Jari Aaltod166f041997-06-05 14:59:13 +0000167 i = len = 0;
Jari Aaltobb706242000-03-17 21:46:59 +0000168 temp = do_v9 ? ansicstr (list->word->word, STRLEN (list->word->word), 1, &i, &len)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000169 : list->word->word;
170 if (temp)
Jari Aalto726f6381996-08-26 18:22:31 +0000171 {
Jari Aaltod166f041997-06-05 14:59:13 +0000172 if (do_v9)
173 {
174 for (s = temp; len > 0; len--)
175 putchar (*s++);
176 }
177 else
178 printf ("%s", temp);
179#if defined (SunOS5)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000180 fflush (stdout); /* Fix for bug in SunOS 5.5 printf(3) */
Jari Aaltod166f041997-06-05 14:59:13 +0000181#endif
Jari Aalto726f6381996-08-26 18:22:31 +0000182 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000183 if (do_v9 && temp)
184 free (temp);
185 list = list->next;
186 if (i)
187 {
188 display_return = 0;
189 break;
190 }
191 if (list)
192 putchar(' ');
Jari Aalto726f6381996-08-26 18:22:31 +0000193 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000194
Jari Aalto726f6381996-08-26 18:22:31 +0000195 if (display_return)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000196 putchar ('\n');
Jari Aalto31859422009-01-12 13:36:28 +0000197
198 terminate_immediately--;
199 return (sh_chkwrite (EXECUTION_SUCCESS));
Jari Aalto726f6381996-08-26 18:22:31 +0000200}