1 /* Copyright (C) 1996 Free Software Foundation, Inc.
3 This file is part of GNU Bash, the Bourne Again SHell.
5 Bash is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2, or (at your option) any later
10 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
11 WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 You should have received a copy of the GNU General Public License along
16 with Bash; see the file COPYING. If not, write to the Free Software
17 Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
21 #if defined (HAVE_UNISTD_H)
23 # include <sys/types.h>
34 #include "../bashansi.h"
38 #include "../builtins.h"
41 #include "../execute_cmd.h"
46 # include "../bashhist.h"
55 #define IS_BUILTIN(s) (builtin_address_internal(s, 0) != (struct builtin *)NULL)
57 extern int indirection_level, startup_state, subshell_environment;
58 extern int line_number;
59 extern int last_command_exit_value;
60 extern int running_trap;
61 extern int posixly_correct;
63 int parse_and_execute_level = 0;
65 static int cat_file __P((REDIRECT *));
67 /* How to force parse_and_execute () to clean up after itself. */
69 parse_and_execute_cleanup ()
73 run_trap_cleanup (running_trap - 1);
74 unfreeze_jobs_list ();
76 run_unwind_frame ("parse_and_execute_top");
79 /* Parse and execute the commands in STRING. Returns whatever
80 execute_command () returns. This frees STRING. FLAGS is a
81 flags word; look in common.h for the possible values. Actions
83 (flags & SEVAL_NONINT) -> interactive = 0;
84 (flags & SEVAL_INTERACT) -> interactive = 1;
85 (flags & SEVAL_NOHIST) -> call bash_history_disable ()
89 parse_and_execute (string, from_file, flags)
91 const char *from_file;
95 volatile int should_jump_to_top_level, last_result;
97 COMMAND *volatile command;
100 /* Unwind protect this invocation of parse_and_execute (). */
101 begin_unwind_frame ("parse_and_execute_top");
102 unwind_protect_int (parse_and_execute_level);
103 unwind_protect_jmp_buf (top_level);
104 unwind_protect_int (indirection_level);
105 unwind_protect_int (line_number);
106 if (flags & (SEVAL_NONINT|SEVAL_INTERACT))
107 unwind_protect_int (interactive);
109 #if defined (HISTORY)
110 unwind_protect_int (remember_on_history); /* can be used in scripts */
111 # if defined (BANG_HISTORY)
112 if (interactive_shell)
114 unwind_protect_int (history_expansion_inhibited);
116 # endif /* BANG_HISTORY */
119 if (interactive_shell)
121 x = get_current_prompt_level ();
122 add_unwind_protect (set_current_prompt_level, x);
125 add_unwind_protect (pop_stream, (char *)NULL);
127 add_unwind_protect (xfree, orig_string);
130 parse_and_execute_level++;
131 push_stream (1); /* reset the line number */
133 if (flags & (SEVAL_NONINT|SEVAL_INTERACT))
134 interactive = (flags & SEVAL_NONINT) ? 0 : 1;
136 #if defined (HISTORY)
137 if (flags & SEVAL_NOHIST)
138 bash_history_disable ();
141 code = should_jump_to_top_level = 0;
142 last_result = EXECUTION_SUCCESS;
143 command = (COMMAND *)NULL;
145 with_input_from_string (string, from_file);
146 while (*(bash_input.location.string))
150 last_result = EXECUTION_FAILURE;
154 /* Provide a location for functions which `longjmp (top_level)' to
155 jump to. This prevents errors in substitution from restarting
156 the reader loop directly, for example. */
157 code = setjmp (top_level);
161 should_jump_to_top_level = 0;
166 run_unwind_frame ("pe_dispose");
167 /* Remember to call longjmp (top_level) after the old
168 value for it is restored. */
169 should_jump_to_top_level = 1;
173 run_unwind_frame ("pe_dispose");
174 last_result = last_command_exit_value = EXECUTION_FAILURE; /* XXX */
175 if (subshell_environment)
177 should_jump_to_top_level = 1;
183 dispose_command (command); /* pe_dispose does this */
189 command_error ("parse_and_execute", CMDERR_BADJUMP, code, 0);
194 if (parse_command () == 0)
196 if (interactive_shell == 0 && read_but_dont_execute)
198 last_result = EXECUTION_SUCCESS;
199 dispose_command (global_command);
200 global_command = (COMMAND *)NULL;
202 else if (command = global_command)
204 struct fd_bitmap *bitmap;
206 bitmap = new_fd_bitmap (FD_BITMAP_SIZE);
207 begin_unwind_frame ("pe_dispose");
208 add_unwind_protect (dispose_fd_bitmap, bitmap);
209 add_unwind_protect (dispose_command, command); /* XXX */
211 global_command = (COMMAND *)NULL;
213 #if defined (ONESHOT)
216 * we were invoked as `bash -c' (startup_state == 2) AND
217 * parse_and_execute has not been called recursively AND
218 * we have parsed the full command (string == '\0') AND
219 * we have a simple command without redirections AND
220 * the command is not being timed
222 * tell the execution code that we don't need to fork
224 if (startup_state == 2 && parse_and_execute_level == 1 &&
225 *bash_input.location.string == '\0' &&
226 command->type == cm_simple &&
227 !command->redirects && !command->value.Simple->redirects &&
228 ((command->flags & CMD_TIME_PIPELINE) == 0))
230 command->flags |= CMD_NO_FORK;
231 command->value.Simple->flags |= CMD_NO_FORK;
235 /* See if this is a candidate for $( <file ). */
236 if (startup_state == 2 &&
237 (subshell_environment & SUBSHELL_COMSUB) &&
238 *bash_input.location.string == '\0' &&
239 command->type == cm_simple && !command->redirects &&
240 (command->flags & CMD_TIME_PIPELINE) == 0 &&
241 command->value.Simple->words == 0 &&
242 command->value.Simple->redirects &&
243 command->value.Simple->redirects->next == 0 &&
244 command->value.Simple->redirects->instruction == r_input_direction)
247 r = cat_file (command->value.Simple->redirects);
248 last_result = (r < 0) ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
251 last_result = execute_command_internal
252 (command, 0, NO_PIPE, NO_PIPE, bitmap);
254 dispose_command (command);
255 dispose_fd_bitmap (bitmap);
256 discard_unwind_frame ("pe_dispose");
261 last_result = EXECUTION_FAILURE;
263 /* Since we are shell compatible, syntax errors in a script
264 abort the execution of the script. Right? */
271 run_unwind_frame ("parse_and_execute_top");
273 if (interrupt_state && parse_and_execute_level == 0)
275 /* An interrupt during non-interactive execution in an
276 interactive shell (e.g. via $PROMPT_COMMAND) should
277 not cause the shell to exit. */
278 interactive = interactive_shell;
279 throw_to_top_level ();
282 if (should_jump_to_top_level)
283 jump_to_top_level (code);
285 return (last_result);
288 /* Handle a $( < file ) command substitution. This expands the filename,
289 returning errors as appropriate, then just cats the file to the standard
299 if (r->instruction != r_input_direction)
302 /* Get the filename. */
303 if (posixly_correct && !interactive_shell)
304 disallow_filename_globbing++;
305 fn = redirection_expand (r->redirectee.filename);
306 if (posixly_correct && !interactive_shell)
307 disallow_filename_globbing--;
311 redirection_error (r, AMBIGUOUS_REDIRECT);
315 fd = open(fn, O_RDONLY);
326 nr = zread (fd, lbuf, sizeof(lbuf));
334 if (zwrite (1, lbuf, nr) < 0)