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"
45 # include "../bashhist.h"
54 #define IS_BUILTIN(s) (builtin_address_internal(s, 0) != (struct builtin *)NULL)
56 extern void run_trap_cleanup ();
59 extern int interactive
, interactive_shell
;
60 extern int indirection_level
, startup_state
, subshell_environment
;
61 extern int line_number
;
62 extern int last_command_exit_value
;
63 extern int running_trap
;
64 extern int posixly_correct
;
65 extern COMMAND
*global_command
;
67 int parse_and_execute_level
= 0;
69 static int cat_file ();
71 /* How to force parse_and_execute () to clean up after itself. */
73 parse_and_execute_cleanup ()
77 run_trap_cleanup (running_trap
- 1);
78 unfreeze_jobs_list ();
80 run_unwind_frame ("parse_and_execute_top");
83 /* Parse and execute the commands in STRING. Returns whatever
84 execute_command () returns. This frees STRING. FLAGS is a
85 flags word; look in common.h for the possible values. Actions
87 (flags & SEVAL_NONINT) -> interactive = 0;
88 (flags & SEVAL_INTERACT) -> interactive = 1;
89 (flags & SEVAL_NOHIST) -> call bash_history_disable ()
93 parse_and_execute (string
, from_file
, flags
)
99 volatile int should_jump_to_top_level
, last_result
;
101 COMMAND
*volatile command
;
103 orig_string
= string
;
104 /* Unwind protect this invocation of parse_and_execute (). */
105 begin_unwind_frame ("parse_and_execute_top");
106 unwind_protect_int (parse_and_execute_level
);
107 unwind_protect_jmp_buf (top_level
);
108 unwind_protect_int (indirection_level
);
109 unwind_protect_int (line_number
);
110 if (flags
& (SEVAL_NONINT
|SEVAL_INTERACT
))
111 unwind_protect_int (interactive
);
113 #if defined (HISTORY)
114 unwind_protect_int (remember_on_history
); /* can be used in scripts */
115 # if defined (BANG_HISTORY)
116 if (interactive_shell
)
118 unwind_protect_int (history_expansion_inhibited
);
120 # endif /* BANG_HISTORY */
123 if (interactive_shell
)
125 x
= get_current_prompt_level ();
126 add_unwind_protect (set_current_prompt_level
, x
);
129 add_unwind_protect (pop_stream
, (char *)NULL
);
131 add_unwind_protect (xfree
, orig_string
);
134 parse_and_execute_level
++;
135 push_stream (1); /* reset the line number */
137 if (flags
& (SEVAL_NONINT
|SEVAL_INTERACT
))
138 interactive
= (flags
& SEVAL_NONINT
) ? 0 : 1;
140 #if defined (HISTORY)
141 if (flags
& SEVAL_NOHIST
)
142 bash_history_disable ();
145 code
= should_jump_to_top_level
= 0;
146 last_result
= EXECUTION_SUCCESS
;
147 command
= (COMMAND
*)NULL
;
149 with_input_from_string (string
, from_file
);
150 while (*(bash_input
.location
.string
))
154 last_result
= EXECUTION_FAILURE
;
158 /* Provide a location for functions which `longjmp (top_level)' to
159 jump to. This prevents errors in substitution from restarting
160 the reader loop directly, for example. */
161 code
= setjmp (top_level
);
165 should_jump_to_top_level
= 0;
170 run_unwind_frame ("pe_dispose");
171 /* Remember to call longjmp (top_level) after the old
172 value for it is restored. */
173 should_jump_to_top_level
= 1;
177 run_unwind_frame ("pe_dispose");
178 last_result
= last_command_exit_value
= EXECUTION_FAILURE
; /* XXX */
179 if (subshell_environment
)
181 should_jump_to_top_level
= 1;
187 dispose_command (command
); /* pe_dispose does this */
193 command_error ("parse_and_execute", CMDERR_BADJUMP
, code
, 0);
198 if (parse_command () == 0)
200 if (interactive_shell
== 0 && read_but_dont_execute
)
202 last_result
= EXECUTION_SUCCESS
;
203 dispose_command (global_command
);
204 global_command
= (COMMAND
*)NULL
;
206 else if (command
= global_command
)
208 struct fd_bitmap
*bitmap
;
210 bitmap
= new_fd_bitmap (FD_BITMAP_SIZE
);
211 begin_unwind_frame ("pe_dispose");
212 add_unwind_protect (dispose_fd_bitmap
, bitmap
);
213 add_unwind_protect (dispose_command
, command
); /* XXX */
215 global_command
= (COMMAND
*)NULL
;
217 #if defined (ONESHOT)
220 * we were invoked as `bash -c' (startup_state == 2) AND
221 * parse_and_execute has not been called recursively AND
222 * we have parsed the full command (string == '\0') AND
223 * we have a simple command without redirections AND
224 * the command is not being timed
226 * tell the execution code that we don't need to fork
228 if (startup_state
== 2 && parse_and_execute_level
== 1 &&
229 *bash_input
.location
.string
== '\0' &&
230 command
->type
== cm_simple
&&
231 !command
->redirects
&& !command
->value
.Simple
->redirects
&&
232 ((command
->flags
& CMD_TIME_PIPELINE
) == 0))
234 command
->flags
|= CMD_NO_FORK
;
235 command
->value
.Simple
->flags
|= CMD_NO_FORK
;
239 /* See if this is a candidate for $( <file ). */
240 if (startup_state
== 2 &&
241 (subshell_environment
& SUBSHELL_COMSUB
) &&
242 *bash_input
.location
.string
== '\0' &&
243 command
->type
== cm_simple
&& !command
->redirects
&&
244 (command
->flags
& CMD_TIME_PIPELINE
) == 0 &&
245 command
->value
.Simple
->words
== 0 &&
246 command
->value
.Simple
->redirects
&&
247 command
->value
.Simple
->redirects
->next
== 0 &&
248 command
->value
.Simple
->redirects
->instruction
== r_input_direction
)
251 r
= cat_file (command
->value
.Simple
->redirects
);
252 last_result
= (r
< 0) ? EXECUTION_FAILURE
: EXECUTION_SUCCESS
;
255 last_result
= execute_command_internal
256 (command
, 0, NO_PIPE
, NO_PIPE
, bitmap
);
258 dispose_command (command
);
259 dispose_fd_bitmap (bitmap
);
260 discard_unwind_frame ("pe_dispose");
265 last_result
= EXECUTION_FAILURE
;
267 /* Since we are shell compatible, syntax errors in a script
268 abort the execution of the script. Right? */
275 run_unwind_frame ("parse_and_execute_top");
277 if (interrupt_state
&& parse_and_execute_level
== 0)
279 /* An interrupt during non-interactive execution in an
280 interactive shell (e.g. via $PROMPT_COMMAND) should
281 not cause the shell to exit. */
282 interactive
= interactive_shell
;
283 throw_to_top_level ();
286 if (should_jump_to_top_level
)
287 jump_to_top_level (code
);
289 return (last_result
);
292 /* Handle a $( < file ) command substitution. This expands the filename,
293 returning errors as appropriate, then just cats the file to the standard
302 if (r
->instruction
!= r_input_direction
)
305 /* Get the filename. */
306 if (posixly_correct
&& !interactive_shell
)
307 disallow_filename_globbing
++;
308 fn
= redirection_expand (r
->redirectee
.filename
);
309 if (posixly_correct
&& !interactive_shell
)
310 disallow_filename_globbing
--;
314 redirection_error (r
, AMBIGUOUS_REDIRECT
);
318 fd
= open(fn
, O_RDONLY
);
329 nr
= zread (fd
, lbuf
, sizeof(lbuf
));
337 if (zwrite (1, lbuf
, nr
) < 0)