]> git.ipfire.org Git - thirdparty/bash.git/blame - builtins/echo.def
Bash-4.3 patch 39
[thirdparty/bash.git] / builtins / echo.def
CommitLineData
726f6388
JA
1This file is echo.def, from which is created echo.c.
2It implements the builtin "echo" in Bash.
3
3185942a 4Copyright (C) 1987-2009 Free Software Foundation, Inc.
726f6388
JA
5
6This file is part of GNU Bash, the Bourne Again SHell.
7
3185942a
JA
8Bash 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.
726f6388 12
3185942a
JA
13Bash 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.
726f6388 17
3185942a
JA
18You should have received a copy of the GNU General Public License
19along with Bash. If not, see <http://www.gnu.org/licenses/>.
726f6388
JA
20
21$PRODUCES echo.c
ccc6cda3
JA
22#include <config.h>
23
24#if defined (HAVE_UNISTD_H)
25# include <unistd.h>
26#endif
27
d166f048
JA
28#include "../bashansi.h"
29
726f6388
JA
30#include <stdio.h>
31#include "../shell.h"
32
0628567a
JA
33#include "common.h"
34
726f6388
JA
35$BUILTIN echo
36$FUNCTION echo_builtin
37$DEPENDS_ON V9_ECHO
38$SHORT_DOC echo [-neE] [arg ...]
3185942a
JA
39Write arguments to the standard output.
40
ac50fbac
CR
41Display the ARGs, separated by a single space character and followed by a
42newline, on the standard output.
3185942a
JA
43
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
ac50fbac 54 \E escape character
3185942a
JA
55 \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.
726f6388
JA
68$END
69
70$BUILTIN echo
71$FUNCTION echo_builtin
72$DEPENDS_ON !V9_ECHO
73$SHORT_DOC echo [-n] [arg ...]
3185942a
JA
74Write 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.
726f6388
JA
83$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
bb70624e
JA
91/* 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. */
95732b49 96#if defined (DEFAULT_ECHO_TO_XPG) || defined (STRICT_POSIX)
bb70624e
JA
97int xpg_echo = 1;
98#else
99int xpg_echo = 0;
100#endif /* DEFAULT_ECHO_TO_XPG */
101
95732b49
JA
102extern int posixly_correct;
103
726f6388
JA
104/* 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
ccc6cda3
JA
106 echo syntax from Version 9 Unix systems. */
107int
726f6388
JA
108echo_builtin (list)
109 WORD_LIST *list;
110{
d166f048
JA
111 int display_return, do_v9, i, len;
112 char *temp, *s;
726f6388 113
bb70624e 114 do_v9 = xpg_echo;
ccc6cda3 115 display_return = 1;
726f6388 116
95732b49
JA
117 if (posixly_correct && xpg_echo)
118 goto just_echo;
119
ccc6cda3
JA
120 for (; list && (temp = list->word->word) && *temp == '-'; list = list->next)
121 {
726f6388
JA
122 /* 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. */
ccc6cda3 125 temp++;
726f6388
JA
126
127 for (i = 0; temp[i]; i++)
128 {
129 if (strchr (VALID_ECHO_OPTIONS, temp[i]) == 0)
ccc6cda3 130 break;
726f6388
JA
131 }
132
ccc6cda3
JA
133 /* echo - and echo -<nonopt> both mean to just echo the arguments. */
134 if (*temp == 0 || temp[i])
135 break;
726f6388
JA
136
137 /* All of the options in TEMP are valid options to ECHO.
138 Handle them. */
ccc6cda3 139 while (i = *temp++)
726f6388 140 {
ccc6cda3
JA
141 switch (i)
142 {
143 case 'n':
144 display_return = 0;
145 break;
726f6388 146#if defined (V9_ECHO)
ccc6cda3
JA
147 case 'e':
148 do_v9 = 1;
149 break;
150 case 'E':
151 do_v9 = 0;
152 break;
726f6388 153#endif /* V9_ECHO */
ccc6cda3
JA
154 default:
155 goto just_echo; /* XXX */
156 }
726f6388 157 }
726f6388
JA
158 }
159
160just_echo:
161
b80f6443
JA
162 clearerr (stdout); /* clear error before writing and testing success */
163
3185942a 164 terminate_immediately++;
ccc6cda3 165 while (list)
726f6388 166 {
d166f048 167 i = len = 0;
bb70624e 168 temp = do_v9 ? ansicstr (list->word->word, STRLEN (list->word->word), 1, &i, &len)
ccc6cda3
JA
169 : list->word->word;
170 if (temp)
726f6388 171 {
d166f048
JA
172 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)
ccc6cda3 180 fflush (stdout); /* Fix for bug in SunOS 5.5 printf(3) */
d166f048 181#endif
726f6388 182 }
ccc6cda3
JA
183 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(' ');
726f6388 193 }
ccc6cda3 194
726f6388 195 if (display_return)
ccc6cda3 196 putchar ('\n');
3185942a
JA
197
198 terminate_immediately--;
199 return (sh_chkwrite (EXECUTION_SUCCESS));
726f6388 200}