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
);