]> git.ipfire.org Git - thirdparty/bash.git/blame - eval.c
fixes for HAVE_SELECT/HAVE_PSELECT; change some warning messages for nameref loops...
[thirdparty/bash.git] / eval.c
CommitLineData
bb70624e 1/* eval.c -- reading and evaluating commands. */
ccc6cda3 2
52ae6c3f 3/* Copyright (C) 1996-2022 Free Software Foundation, Inc.
ccc6cda3 4
bb70624e 5 This file is part of GNU Bash, the Bourne Again SHell.
ccc6cda3 6
2e4498b3
CR
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
ccc6cda3 11
2e4498b3
CR
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
ccc6cda3 16
bb70624e 17 You should have received a copy of the GNU General Public License
2e4498b3
CR
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
19*/
ccc6cda3
JA
20
21#include "config.h"
22
23#if defined (HAVE_UNISTD_H)
cce855bc
JA
24# ifdef _MINIX
25# include <sys/types.h>
26# endif
ccc6cda3
JA
27# include <unistd.h>
28#endif
29
30#include "bashansi.h"
31#include <stdio.h>
32
8f50a023
CR
33#include <signal.h>
34
5e13499c
CR
35#include "bashintl.h"
36
ccc6cda3 37#include "shell.h"
ec157dfe 38#include "parser.h"
ccc6cda3
JA
39#include "flags.h"
40#include "trap.h"
41
42#include "builtins/common.h"
43
44#include "input.h"
45#include "execute_cmd.h"
46
b72432fd
JA
47#if defined (HISTORY)
48# include "bashhist.h"
49#endif
50
ab309487
CR
51static void send_pwd_to_eterm PARAMS((void));
52static sighandler alrm_catcher PARAMS((int));
7117c2d2 53
ccc6cda3
JA
54/* Read and execute commands until EOF is reached. This assumes that
55 the input source has already been initialized. */
56int
57reader_loop ()
58{
59 int our_indirection_level;
1c72c0cd 60 COMMAND * volatile current_command;
ccc6cda3 61
f73dda09
JA
62 USE_VAR(current_command);
63
30915f17
CR
64 current_command = (COMMAND *)NULL;
65
ccc6cda3
JA
66 our_indirection_level = ++indirection_level;
67
96efdbb5
CR
68 if (just_one_command)
69 reset_readahead_token ();
70
ccc6cda3
JA
71 while (EOF_Reached == 0)
72 {
73 int code;
74
36eb585c 75 code = setjmp_nosigs (top_level);
ccc6cda3
JA
76
77#if defined (PROCESS_SUBSTITUTION)
78 unlink_fifo_list ();
79#endif /* PROCESS_SUBSTITUTION */
80
de608191
CR
81 /* XXX - why do we set this every time through the loop? And why do
82 it if SIGINT is trapped in an interactive shell? */
78a3f8a4 83 if (interactive_shell && signal_is_ignored (SIGINT) == 0 && signal_is_trapped (SIGINT) == 0)
ccc6cda3
JA
84 set_signal_handler (SIGINT, sigint_sighandler);
85
86 if (code != NOT_JUMPED)
87 {
88 indirection_level = our_indirection_level;
89
90 switch (code)
91 {
39feef01 92 /* Some kind of throw to top_level has occurred. */
d3a24ed2 93 case ERREXIT:
52ae6c3f
CR
94 if (exit_immediately_on_error)
95 reset_local_contexts (); /* not in a function */
96 case FORCE_EOF:
ccc6cda3 97 case EXITPROG:
9928dcb4 98 case EXITBLTIN:
ccc6cda3
JA
99 current_command = (COMMAND *)NULL;
100 EOF_Reached = EOF;
101 goto exec_done;
102
103 case DISCARD:
866961ad
CR
104 /* Make sure the exit status is reset to a non-zero value, but
105 leave existing non-zero values (e.g., > 128 on signal)
106 alone. */
107 if (last_command_exit_value == 0)
194cfc28 108 set_exit_status (EXECUTION_FAILURE);
ccc6cda3
JA
109 if (subshell_environment)
110 {
111 current_command = (COMMAND *)NULL;
112 EOF_Reached = EOF;
113 goto exec_done;
114 }
115 /* Obstack free command elements, etc. */
116 if (current_command)
117 {
118 dispose_command (current_command);
119 current_command = (COMMAND *)NULL;
120 }
f65f3d54
CR
121
122 restore_sigmask ();
ccc6cda3
JA
123 break;
124
125 default:
b72432fd 126 command_error ("reader_loop", CMDERR_BADJUMP, code, 0);
ccc6cda3
JA
127 }
128 }
129
130 executing = 0;
7117c2d2
JA
131 if (temporary_env)
132 dispose_used_env_vars ();
ccc6cda3
JA
133
134#if (defined (ultrix) && defined (mips)) || defined (C_ALLOCA)
135 /* Attempt to reclaim memory allocated with alloca (). */
136 (void) alloca (0);
137#endif
138
139 if (read_command () == 0)
140 {
141 if (interactive_shell == 0 && read_but_dont_execute)
142 {
b2b78a63 143 set_exit_status (last_command_exit_value);
ccc6cda3
JA
144 dispose_command (global_command);
145 global_command = (COMMAND *)NULL;
146 }
147 else if (current_command = global_command)
148 {
149 global_command = (COMMAND *)NULL;
602edf7f
CR
150
151 /* If the shell is interactive, expand and display $PS0 after reading a
152 command (possibly a list or pipeline) and before executing it. */
153 if (interactive && ps0_prompt)
154 {
155 char *ps0_string;
156
157 ps0_string = decode_prompt_string (ps0_prompt);
158 if (ps0_string && *ps0_string)
159 {
160 fprintf (stderr, "%s", ps0_string);
161 fflush (stderr);
162 }
163 free (ps0_string);
164 }
165
21c9990f
CR
166 current_command_number++;
167
168 executing = 1;
169 stdin_redir = 0;
170
ccc6cda3
JA
171 execute_command (current_command);
172
173 exec_done:
66e6d7cf
CR
174 QUIT;
175
ccc6cda3 176 if (current_command)
28ef6c31 177 {
ccc6cda3
JA
178 dispose_command (current_command);
179 current_command = (COMMAND *)NULL;
28ef6c31 180 }
ccc6cda3
JA
181 }
182 }
183 else
184 {
185 /* Parse error, maybe discard rest of stream if not interactive. */
186 if (interactive == 0)
187 EOF_Reached = EOF;
188 }
189 if (just_one_command)
190 EOF_Reached = EOF;
191 }
192 indirection_level--;
193 return (last_command_exit_value);
194}
195
ac495185
CR
196/* Pretty print shell scripts */
197int
198pretty_print_loop ()
199{
200 COMMAND *current_command;
201 char *command_to_print;
202 int code;
203 int global_posix_mode, last_was_newline;
204
205 global_posix_mode = posixly_correct;
206 last_was_newline = 0;
207 while (EOF_Reached == 0)
208 {
209 code = setjmp_nosigs (top_level);
210 if (code)
211 return (EXECUTION_FAILURE);
212 if (read_command() == 0)
213 {
214 current_command = global_command;
215 global_command = 0;
216 posixly_correct = 1; /* print posix-conformant */
217 if (current_command && (command_to_print = make_command_string (current_command)))
218 {
219 printf ("%s\n", command_to_print); /* for now */
220 last_was_newline = 0;
221 }
222 else if (last_was_newline == 0)
223 {
224 printf ("\n");
225 last_was_newline = 1;
226 }
227 posixly_correct = global_posix_mode;
228 dispose_command (current_command);
229 }
230 else
231 return (EXECUTION_FAILURE);
232 }
233
234 return (EXECUTION_SUCCESS);
235}
236
ccc6cda3
JA
237static sighandler
238alrm_catcher(i)
239 int i;
240{
51f1f17b
CR
241 char *msg;
242
243 msg = _("\007timed out waiting for input: auto-logout\n");
244 write (1, msg, strlen (msg));
245
d3a24ed2 246 bash_logout (); /* run ~/.bash_logout if this is a login shell */
ccc6cda3
JA
247 jump_to_top_level (EXITPROG);
248 SIGRETURN (0);
249}
250
251/* Send an escape sequence to emacs term mode to tell it the
252 current working directory. */
253static void
254send_pwd_to_eterm ()
255{
631b20c6 256 char *pwd, *f;
ccc6cda3 257
631b20c6 258 f = 0;
ccc6cda3
JA
259 pwd = get_string_value ("PWD");
260 if (pwd == 0)
631b20c6 261 f = pwd = get_working_directory ("eterm");
ccc6cda3 262 fprintf (stderr, "\032/%s\n", pwd);
631b20c6 263 free (f);
ccc6cda3
JA
264}
265
5f49ef47 266#if defined (ARRAY_VARS)
c261f9b8 267/* Caller ensures that A has a non-zero number of elements */
e2e18b72 268int
c261f9b8
CR
269execute_array_command (a, v)
270 ARRAY *a;
5f49ef47
CR
271 void *v;
272{
c261f9b8
CR
273 char *tag;
274 char **argv;
275 int argc, i;
5f49ef47
CR
276
277 tag = (char *)v;
c261f9b8
CR
278 argc = 0;
279 argv = array_to_argv (a, &argc);
280 for (i = 0; i < argc; i++)
281 {
282 if (argv[i] && argv[i][0])
283 execute_variable_command (argv[i], tag);
284 }
285 strvec_dispose (argv);
e2e18b72 286 return 0;
5f49ef47
CR
287}
288#endif
289
fc132f73
CR
290static void
291execute_prompt_command ()
292{
293 char *command_to_execute;
5f49ef47 294 SHELL_VAR *pcv;
e4d38c2d 295#if defined (ARRAY_VARS)
5f49ef47 296 ARRAY *pcmds;
e4d38c2d 297#endif
5f49ef47 298
e4d38c2d
CR
299 pcv = find_variable ("PROMPT_COMMAND");
300 if (pcv == 0 || var_isset (pcv) == 0 || invisible_p (pcv))
301 return;
302#if defined (ARRAY_VARS)
303 if (array_p (pcv))
5f49ef47 304 {
e4d38c2d 305 if ((pcmds = array_cell (pcv)) && array_num_elements (pcmds) > 0)
c261f9b8 306 execute_array_command (pcmds, "PROMPT_COMMAND");
5f49ef47
CR
307 return;
308 }
e4d38c2d 309 else if (assoc_p (pcv))
c261f9b8 310 return; /* currently don't allow associative arrays here */
5f49ef47 311#endif
fc132f73 312
e4d38c2d 313 command_to_execute = value_cell (pcv);
5f49ef47 314 if (command_to_execute && *command_to_execute)
fc132f73
CR
315 execute_variable_command (command_to_execute, "PROMPT_COMMAND");
316}
e2e18b72 317
ccc6cda3
JA
318/* Call the YACC-generated parser and return the status of the parse.
319 Input is read from the current input stream (bash_input). yyparse
320 leaves the parsed command in the global variable GLOBAL_COMMAND.
321 This is where PROMPT_COMMAND is executed. */
322int
323parse_command ()
324{
325 int r;
ccc6cda3
JA
326
327 need_here_doc = 0;
328 run_pending_traps ();
329
330 /* Allow the execution of a random command just before the printing
331 of each primary prompt. If the shell variable PROMPT_COMMAND
e4d38c2d 332 is set then its value (array or string) is the command(s) to execute. */
80c3b1d4
CR
333 /* The tests are a combination of SHOULD_PROMPT() and prompt_again()
334 from parse.y, which are the conditions under which the prompt is
335 actually printed. */
336 if (interactive && bash_input.type != st_string && parser_expanding_alias() == 0)
ccc6cda3 337 {
42a9b8a1
CR
338#if defined (READLINE)
339 if (no_line_editing || (bash_input.type == st_stdin && parser_will_prompt ()))
340#endif
341 execute_prompt_command ();
ccc6cda3
JA
342
343 if (running_under_emacs == 2)
344 send_pwd_to_eterm (); /* Yuck */
345 }
346
347 current_command_line_count = 0;
348 r = yyparse ();
349
350 if (need_here_doc)
351 gather_here_documents ();
352
353 return (r);
354}
355
356/* Read and parse a command, returning the status of the parse. The command
357 is left in the globval variable GLOBAL_COMMAND for use by reader_loop.
358 This is where the shell timeout code is executed. */
359int
360read_command ()
361{
362 SHELL_VAR *tmout_var;
363 int tmout_len, result;
364 SigHandler *old_alrm;
365
bb70624e 366 set_current_prompt_level (1);
ccc6cda3
JA
367 global_command = (COMMAND *)NULL;
368
369 /* Only do timeouts if interactive. */
370 tmout_var = (SHELL_VAR *)NULL;
371 tmout_len = 0;
f73dda09 372 old_alrm = (SigHandler *)NULL;
ccc6cda3
JA
373
374 if (interactive)
375 {
376 tmout_var = find_variable ("TMOUT");
ccc6cda3 377
7117c2d2 378 if (tmout_var && var_isset (tmout_var))
ccc6cda3 379 {
7117c2d2 380 tmout_len = atoi (value_cell (tmout_var));
ccc6cda3
JA
381 if (tmout_len > 0)
382 {
383 old_alrm = set_signal_handler (SIGALRM, alrm_catcher);
384 alarm (tmout_len);
385 }
386 }
387 }
388
389 QUIT;
390
391 current_command_line_count = 0;
392 result = parse_command ();
393
394 if (interactive && tmout_var && (tmout_len > 0))
395 {
396 alarm(0);
397 set_signal_handler (SIGALRM, old_alrm);
398 }
399
400 return (result);
401}