blob: 16846ace8a5bcd1eac77f9d58e864badc6223e4a [file] [log] [blame]
Jari Aalto726f6381996-08-26 18:22:31 +00001This file is exec.def, from which is created exec.c.
2It implements the builtin "exec" in Bash.
3
Chet Rameyac50fba2014-02-26 09:36:43 -05004Copyright (C) 1987-2012 Free Software Foundation, Inc.
Jari Aalto726f6381996-08-26 18:22:31 +00005
6This file is part of GNU Bash, the Bourne Again SHell.
7
Jari Aalto31859422009-01-12 13:36:28 +00008Bash is free software: you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
Jari Aalto726f6381996-08-26 18:22:31 +000012
Jari Aalto31859422009-01-12 13:36:28 +000013Bash is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
Jari Aalto726f6381996-08-26 18:22:31 +000017
Jari Aalto31859422009-01-12 13:36:28 +000018You should have received a copy of the GNU General Public License
19along with Bash. If not, see <http://www.gnu.org/licenses/>.
Jari Aalto726f6381996-08-26 18:22:31 +000020
21$PRODUCES exec.c
22
23$BUILTIN exec
24$FUNCTION exec_builtin
Jari Aalto31859422009-01-12 13:36:28 +000025$SHORT_DOC exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
26Replace the shell with the given command.
27
28Execute COMMAND, replacing this shell with the specified program.
29ARGUMENTS become the arguments to COMMAND. If COMMAND is not specified,
30any redirections take effect in the current shell.
31
32Options:
33 -a name pass NAME as the zeroth argument to COMMAND
34 -c execute COMMAND with an empty environment
35 -l place a dash in the zeroth argument to COMMAND
36
37If the command cannot be executed, a non-interactive shell exits, unless
38the shell option `execfail' is set.
39
40Exit Status:
41Returns success unless COMMAND is not found or a redirection error occurs.
Jari Aalto726f6381996-08-26 18:22:31 +000042$END
43
Jari Aaltoccc6cda1996-12-23 17:02:34 +000044#include <config.h>
45
Jari Aaltod166f041997-06-05 14:59:13 +000046#include "../bashtypes.h"
Jari Aaltobb706242000-03-17 21:46:59 +000047#include "posixstat.h"
Jari Aalto726f6381996-08-26 18:22:31 +000048#include <signal.h>
49#include <errno.h>
50
Jari Aaltoccc6cda1996-12-23 17:02:34 +000051#if defined (HAVE_UNISTD_H)
52# include <unistd.h>
53#endif
54
55#include "../bashansi.h"
Jari Aaltob80f6442004-07-27 13:29:18 +000056#include "../bashintl.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000057
58#include "../shell.h"
Jari Aalto726f6381996-08-26 18:22:31 +000059#include "../execute_cmd.h"
Jari Aaltocce855b1998-04-17 19:52:44 +000060#include "../findcmd.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000061#if defined (JOB_CONTROL)
62# include "../jobs.h"
63#endif
Jari Aalto726f6381996-08-26 18:22:31 +000064#include "../flags.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000065#include "../trap.h"
66#if defined (HISTORY)
67# include "../bashhist.h"
68#endif
69#include "common.h"
70#include "bashgetopt.h"
Jari Aalto726f6381996-08-26 18:22:31 +000071
72/* Not all systems declare ERRNO in errno.h... and some systems #define it! */
73#if !defined (errno)
Ricardo Cerqueiraa02fbff2013-07-25 22:35:34 +010074#include <errno.h>
Jari Aalto726f6381996-08-26 18:22:31 +000075#endif /* !errno */
Jari Aaltoccc6cda1996-12-23 17:02:34 +000076
Jari Aaltof73dda02001-11-13 17:56:06 +000077extern int subshell_environment;
Jari Aalto726f6381996-08-26 18:22:31 +000078extern REDIRECT *redirection_undo_list;
Chet Ramey495aee42011-11-22 19:11:26 -050079extern char *exec_argv0;
Jari Aalto726f6381996-08-26 18:22:31 +000080
Jari Aaltoccc6cda1996-12-23 17:02:34 +000081int no_exit_on_failed_exec;
82
83/* If the user wants this to look like a login shell, then
84 prepend a `-' onto NAME and return the new name. */
85static char *
86mkdashname (name)
87 char *name;
88{
89 char *ret;
90
Jari Aaltof73dda02001-11-13 17:56:06 +000091 ret = (char *)xmalloc (2 + strlen (name));
Jari Aaltoccc6cda1996-12-23 17:02:34 +000092 ret[0] = '-';
93 strcpy (ret + 1, name);
94 return ret;
95}
96
Jari Aalto726f6381996-08-26 18:22:31 +000097int
98exec_builtin (list)
99 WORD_LIST *list;
100{
101 int exit_value = EXECUTION_FAILURE;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000102 int cleanenv, login, opt;
Jari Aaltod166f041997-06-05 14:59:13 +0000103 char *argv0, *command, **args, **env, *newname, *com2;
Jari Aalto726f6381996-08-26 18:22:31 +0000104
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000105 cleanenv = login = 0;
Chet Ramey495aee42011-11-22 19:11:26 -0500106 exec_argv0 = argv0 = (char *)NULL;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000107
108 reset_internal_getopt ();
109 while ((opt = internal_getopt (list, "cla:")) != -1)
110 {
111 switch (opt)
112 {
113 case 'c':
114 cleanenv = 1;
115 break;
116 case 'l':
117 login = 1;
118 break;
119 case 'a':
120 argv0 = list_optarg;
121 break;
122 default:
123 builtin_usage ();
124 return (EX_USAGE);
125 }
126 }
127 list = loptend;
Jari Aalto726f6381996-08-26 18:22:31 +0000128
129 /* First, let the redirections remain. */
130 dispose_redirects (redirection_undo_list);
131 redirection_undo_list = (REDIRECT *)NULL;
132
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000133 if (list == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000134 return (EXECUTION_SUCCESS);
Jari Aalto726f6381996-08-26 18:22:31 +0000135
136#if defined (RESTRICTED_SHELL)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000137 if (restricted)
138 {
Jari Aalto7117c2d2002-07-17 14:10:11 +0000139 sh_restricted ((char *)NULL);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000140 return (EXECUTION_FAILURE);
141 }
Jari Aalto726f6381996-08-26 18:22:31 +0000142#endif /* RESTRICTED_SHELL */
143
Jari Aalto7117c2d2002-07-17 14:10:11 +0000144 args = strvec_from_word_list (list, 1, 0, (int *)NULL);
Jari Aalto726f6381996-08-26 18:22:31 +0000145
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000146 /* A command with a slash anywhere in its name is not looked up in $PATH. */
Chet Rameyac50fba2014-02-26 09:36:43 -0500147 command = absolute_program (args[0]) ? args[0] : search_for_command (args[0], 1);
Jari Aalto726f6381996-08-26 18:22:31 +0000148
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000149 if (command == 0)
150 {
Chet Ramey495aee42011-11-22 19:11:26 -0500151 if (file_isdir (args[0]))
152 {
153#if defined (EISDIR)
154 builtin_error (_("%s: cannot execute: %s"), args[0], strerror (EISDIR));
155#else
156 builtin_error (_("%s: cannot execute: %s"), args[0], strerror (errno));
157#endif
158 exit_value = EX_NOEXEC;
159 }
160 else
161 {
162 sh_notfound (args[0]);
163 exit_value = EX_NOTFOUND; /* As per Posix.2, 3.14.6 */
164 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000165 goto failed_exec;
166 }
Jari Aalto726f6381996-08-26 18:22:31 +0000167
Jari Aaltod166f041997-06-05 14:59:13 +0000168 com2 = full_pathname (command);
169 if (com2)
170 {
171 if (command != args[0])
172 free (command);
173 command = com2;
174 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000175
176 if (argv0)
177 {
178 free (args[0]);
179 args[0] = login ? mkdashname (argv0) : savestring (argv0);
Chet Ramey495aee42011-11-22 19:11:26 -0500180 exec_argv0 = savestring (args[0]);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000181 }
182 else if (login)
183 {
184 newname = mkdashname (args[0]);
185 free (args[0]);
186 args[0] = newname;
187 }
188
189 /* Decrement SHLVL by 1 so a new shell started here has the same value,
190 preserving the appearance. After we do that, we need to change the
191 exported environment to include the new value. */
192 if (cleanenv == 0)
193 adjust_shell_level (-1);
194
195 if (cleanenv)
196 env = (char **)NULL;
197 else
198 {
Jari Aalto726f6381996-08-26 18:22:31 +0000199 maybe_make_export_env ();
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000200 env = export_env;
201 }
Jari Aalto726f6381996-08-26 18:22:31 +0000202
203#if defined (HISTORY)
Jari Aaltod166f041997-06-05 14:59:13 +0000204 if (interactive_shell && subshell_environment == 0)
205 maybe_save_shell_history ();
Jari Aalto726f6381996-08-26 18:22:31 +0000206#endif /* HISTORY */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000207
208 restore_original_signals ();
Jari Aalto726f6381996-08-26 18:22:31 +0000209
210#if defined (JOB_CONTROL)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000211 if (subshell_environment == 0)
212 end_job_control ();
Jari Aalto726f6381996-08-26 18:22:31 +0000213#endif /* JOB_CONTROL */
214
Chet Ramey495aee42011-11-22 19:11:26 -0500215 exit_value = shell_execve (command, args, env);
Jari Aaltobc4cd231998-07-23 14:37:54 +0000216
217 /* We have to set this to NULL because shell_execve has called realloc()
218 to stuff more items at the front of the array, which may have caused
219 the memory to be freed by realloc(). We don't want to free it twice. */
220 args = (char **)NULL;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000221 if (cleanenv == 0)
222 adjust_shell_level (1);
Jari Aalto726f6381996-08-26 18:22:31 +0000223
Chet Ramey495aee42011-11-22 19:11:26 -0500224 if (exit_value == EX_NOTFOUND) /* no duplicate error message */
225 goto failed_exec;
226 else if (executable_file (command) == 0)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000227 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000228 builtin_error (_("%s: cannot execute: %s"), command, strerror (errno));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000229 exit_value = EX_NOEXEC; /* As per Posix.2, 3.14.6 */
Jari Aalto726f6381996-08-26 18:22:31 +0000230 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000231 else
232 file_error (command);
233
234failed_exec:
Jari Aaltob80f6442004-07-27 13:29:18 +0000235 FREE (command);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000236
237 if (subshell_environment || (interactive == 0 && no_exit_on_failed_exec == 0))
238 exit_shell (exit_value);
239
Jari Aaltod166f041997-06-05 14:59:13 +0000240 if (args)
Jari Aalto7117c2d2002-07-17 14:10:11 +0000241 strvec_dispose (args);
Jari Aaltod166f041997-06-05 14:59:13 +0000242
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000243 initialize_traps ();
Jari Aalto7117c2d2002-07-17 14:10:11 +0000244 initialize_signals (1);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000245
246#if defined (JOB_CONTROL)
Jari Aalto95732b42005-12-07 14:08:12 +0000247 if (interactive_shell || job_control)
248 restart_job_control ();
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000249#endif /* JOB_CONTROL */
250
251 return (exit_value);
Jari Aalto726f6381996-08-26 18:22:31 +0000252}