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 ()
86 (flags & SEVAL_NOFREE) -> don't free STRING when finished
90 parse_and_execute (string, from_file, flags)
92 const char *from_file;
96 volatile int should_jump_to_top_level, last_result;
98 COMMAND *volatile command;
100 orig_string = string;
101 /* Unwind protect this invocation of parse_and_execute (). */
102 begin_unwind_frame ("parse_and_execute_top");
103 unwind_protect_int (parse_and_execute_level);
104 unwind_protect_jmp_buf (top_level);
105 unwind_protect_int (indirection_level);
106 unwind_protect_int (line_number);
107 if (flags & (SEVAL_NONINT|SEVAL_INTERACT))
108 unwind_protect_int (interactive);
110 #if defined (HISTORY)
111 unwind_protect_int (remember_on_history); /* can be used in scripts */
112 # if defined (BANG_HISTORY)
113 if (interactive_shell)
115 unwind_protect_int (history_expansion_inhibited);
117 # endif /* BANG_HISTORY */
120 if (interactive_shell)
122 x = get_current_prompt_level ();
123 add_unwind_protect (set_current_prompt_level, x);
126 add_unwind_protect (pop_stream, (char *)NULL);
127 if (orig_string && ((flags & SEVAL_NOFREE) == 0))
128 add_unwind_protect (xfree, orig_string);
131 parse_and_execute_level++;
132 push_stream (1); /* reset the line number */
134 if (flags & (SEVAL_NONINT|SEVAL_INTERACT))
135 interactive = (flags & SEVAL_NONINT) ? 0 : 1;
137 #if defined (HISTORY)
138 if (flags & SEVAL_NOHIST)
139 bash_history_disable ();
142 code = should_jump_to_top_level = 0;
143 last_result = EXECUTION_SUCCESS;
144 command = (COMMAND *)NULL;
146 with_input_from_string (string, from_file);
147 while (*(bash_input.location.string))
151 last_result = EXECUTION_FAILURE;
155 /* Provide a location for functions which `longjmp (top_level)' to
156 jump to. This prevents errors in substitution from restarting
157 the reader loop directly, for example. */
158 code = setjmp (top_level);
162 should_jump_to_top_level = 0;
167 run_unwind_frame ("pe_dispose");
168 /* Remember to call longjmp (top_level) after the old
169 value for it is restored. */
170 should_jump_to_top_level = 1;
174 run_unwind_frame ("pe_dispose");
175 last_result = last_command_exit_value = EXECUTION_FAILURE; /* XXX */
176 if (subshell_environment)
178 should_jump_to_top_level = 1;
184 dispose_command (command); /* pe_dispose does this */
190 command_error ("parse_and_execute", CMDERR_BADJUMP, code, 0);
195 if (parse_command () == 0)
197 if (interactive_shell == 0 && read_but_dont_execute)
199 last_result = EXECUTION_SUCCESS;
200 dispose_command (global_command);
201 global_command = (COMMAND *)NULL;
203 else if (command = global_command)
205 struct fd_bitmap *bitmap;
207 bitmap = new_fd_bitmap (FD_BITMAP_SIZE);
208 begin_unwind_frame ("pe_dispose");
209 add_unwind_protect (dispose_fd_bitmap, bitmap);
210 add_unwind_protect (dispose_command, command); /* XXX */
212 global_command = (COMMAND *)NULL;
214 #if defined (ONESHOT)
217 * we were invoked as `bash -c' (startup_state == 2) AND
218 * parse_and_execute has not been called recursively AND
219 * we have parsed the full command (string == '\0') AND
220 * we have a simple command without redirections AND
221 * the command is not being timed
223 * tell the execution code that we don't need to fork
225 if (startup_state == 2 && parse_and_execute_level == 1 &&
226 *bash_input.location.string == '\0' &&
227 command->type == cm_simple &&
228 !command->redirects && !command->value.Simple->redirects &&
229 ((command->flags & CMD_TIME_PIPELINE) == 0))
231 command->flags |= CMD_NO_FORK;
232 command->value.Simple->flags |= CMD_NO_FORK;
236 /* See if this is a candidate for $( <file ). */
237 if (startup_state == 2 &&
238 (subshell_environment & SUBSHELL_COMSUB) &&
239 *bash_input.location.string == '\0' &&
240 command->type == cm_simple && !command->redirects &&
241 (command->flags & CMD_TIME_PIPELINE) == 0 &&
242 command->value.Simple->words == 0 &&
243 command->value.Simple->redirects &&
244 command->value.Simple->redirects->next == 0 &&
245 command->value.Simple->redirects->instruction == r_input_direction)
248 r = cat_file (command->value.Simple->redirects);
249 last_result = (r < 0) ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
252 last_result = execute_command_internal
253 (command, 0, NO_PIPE, NO_PIPE, bitmap);
255 dispose_command (command);
256 dispose_fd_bitmap (bitmap);
257 discard_unwind_frame ("pe_dispose");
262 last_result = EXECUTION_FAILURE;
264 /* Since we are shell compatible, syntax errors in a script
265 abort the execution of the script. Right? */
272 run_unwind_frame ("parse_and_execute_top");
274 if (interrupt_state && parse_and_execute_level == 0)
276 /* An interrupt during non-interactive execution in an
277 interactive shell (e.g. via $PROMPT_COMMAND) should
278 not cause the shell to exit. */
279 interactive = interactive_shell;
280 throw_to_top_level ();
283 if (should_jump_to_top_level)
284 jump_to_top_level (code);
286 return (last_result);
289 /* Handle a $( < file ) command substitution. This expands the filename,
290 returning errors as appropriate, then just cats the file to the standard
300 if (r->instruction != r_input_direction)
303 /* Get the filename. */
304 if (posixly_correct && !interactive_shell)
305 disallow_filename_globbing++;
306 fn = redirection_expand (r->redirectee.filename);
307 if (posixly_correct && !interactive_shell)
308 disallow_filename_globbing--;
312 redirection_error (r, AMBIGUOUS_REDIRECT);
316 fd = open(fn, O_RDONLY);
324 rval = zcatfd (fd, 1, fn);