blob: a6027ca73632899b35f44be8f498e2ece1ffa32a [file] [log] [blame]
Jari Aalto726f6381996-08-26 18:22:31 +00001This file is source.def, from which is created source.c.
2It implements the builtins "." and "source" in Bash.
3
Jari Aalto31859422009-01-12 13:36:28 +00004Copyright (C) 1987-2009 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 source.c
22
23$BUILTIN source
24$FUNCTION source_builtin
Jari Aaltob80f6442004-07-27 13:29:18 +000025$SHORT_DOC source filename [arguments]
Jari Aalto31859422009-01-12 13:36:28 +000026Execute commands from a file in the current shell.
27
28Read and execute commands from FILENAME in the current shell. The
29entries in $PATH are used to find the directory containing FILENAME.
30If any ARGUMENTS are supplied, they become the positional parameters
31when FILENAME is executed.
32
33Exit Status:
34Returns the status of the last command executed in FILENAME; fails if
35FILENAME cannot be read.
Jari Aalto726f6381996-08-26 18:22:31 +000036$END
Jari Aalto31859422009-01-12 13:36:28 +000037
Jari Aalto726f6381996-08-26 18:22:31 +000038$BUILTIN .
39$DOCNAME dot
40$FUNCTION source_builtin
Jari Aaltob80f6442004-07-27 13:29:18 +000041$SHORT_DOC . filename [arguments]
Jari Aalto31859422009-01-12 13:36:28 +000042Execute commands from a file in the current shell.
43
44Read and execute commands from FILENAME in the current shell. The
45entries in $PATH are used to find the directory containing FILENAME.
46If any ARGUMENTS are supplied, they become the positional parameters
47when FILENAME is executed.
48
49Exit Status:
50Returns the status of the last command executed in FILENAME; fails if
51FILENAME cannot be read.
Jari Aalto726f6381996-08-26 18:22:31 +000052$END
Jari Aalto726f6381996-08-26 18:22:31 +000053
Jari Aaltoccc6cda1996-12-23 17:02:34 +000054#include <config.h>
55
56#include "../bashtypes.h"
Jari Aaltobb706242000-03-17 21:46:59 +000057#include "posixstat.h"
58#include "filecntl.h"
Jari Aaltob80f6442004-07-27 13:29:18 +000059#if ! defined(_MINIX) && defined (HAVE_SYS_FILE_H)
Jari Aaltocce855b1998-04-17 19:52:44 +000060# include <sys/file.h>
61#endif
Jari Aalto726f6381996-08-26 18:22:31 +000062#include <errno.h>
63
Jari Aaltoccc6cda1996-12-23 17:02:34 +000064#if defined (HAVE_UNISTD_H)
65# include <unistd.h>
66#endif
67
68#include "../bashansi.h"
Jari Aaltob80f6442004-07-27 13:29:18 +000069#include "../bashintl.h"
Jari Aalto726f6381996-08-26 18:22:31 +000070
71#include "../shell.h"
Jari Aaltob80f6442004-07-27 13:29:18 +000072#include "../flags.h"
Jari Aaltocce855b1998-04-17 19:52:44 +000073#include "../findcmd.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000074#include "common.h"
Jari Aalto7117c2d2002-07-17 14:10:11 +000075#include "bashgetopt.h"
Jari Aaltob80f6442004-07-27 13:29:18 +000076#include "../trap.h"
Jari Aalto726f6381996-08-26 18:22:31 +000077
Jari Aalto726f6381996-08-26 18:22:31 +000078#if !defined (errno)
Ricardo Cerqueiraa02fbff2013-07-25 22:35:34 +010079#include <errno.h>
Jari Aalto726f6381996-08-26 18:22:31 +000080#endif /* !errno */
81
Jari Aalto31859422009-01-12 13:36:28 +000082extern int posixly_correct;
Chet Ramey495aee42011-11-22 19:11:26 -050083extern int last_command_exit_value;
84extern int executing_command_builtin;
Jari Aalto31859422009-01-12 13:36:28 +000085
Jari Aalto06285672006-10-10 14:15:34 +000086static void maybe_pop_dollar_vars __P((void));
Jari Aalto726f6381996-08-26 18:22:31 +000087
Jari Aaltoccc6cda1996-12-23 17:02:34 +000088/* If non-zero, `.' uses $PATH to look up the script to be sourced. */
89int source_uses_path = 1;
Jari Aalto726f6381996-08-26 18:22:31 +000090
Jari Aalto28ef6c32001-04-06 19:14:31 +000091/* If non-zero, `.' looks in the current directory if the filename argument
92 is not found in the $PATH. */
93int source_searches_cwd = 1;
94
Jari Aalto726f6381996-08-26 18:22:31 +000095/* If this . script is supplied arguments, we save the dollar vars and
96 replace them with the script arguments for the duration of the script's
97 execution. If the script does not change the dollar vars, we restore
Jari Aalto28ef6c32001-04-06 19:14:31 +000098 what we saved. If the dollar vars are changed in the script, and we are
99 not executing a shell function, we leave the new values alone and free
100 the saved values. */
Jari Aalto726f6381996-08-26 18:22:31 +0000101static void
102maybe_pop_dollar_vars ()
103{
Jari Aalto7117c2d2002-07-17 14:10:11 +0000104 if (variable_context == 0 && (dollar_vars_changed () & ARGS_SETBLTIN))
105 dispose_saved_dollar_vars ();
Jari Aalto726f6381996-08-26 18:22:31 +0000106 else
107 pop_dollar_vars ();
Jari Aaltob80f6442004-07-27 13:29:18 +0000108 if (debugging_mode)
109 pop_args (); /* restore BASH_ARGC and BASH_ARGV */
Jari Aalto7117c2d2002-07-17 14:10:11 +0000110 set_dollar_vars_unchanged ();
Jari Aalto726f6381996-08-26 18:22:31 +0000111}
112
113/* Read and execute commands from the file passed as argument. Guess what.
114 This cannot be done in a subshell, since things like variable assignments
115 take place in there. So, I open the file, place it into a large string,
116 close the file, and then execute the string. */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000117int
Jari Aalto726f6381996-08-26 18:22:31 +0000118source_builtin (list)
119 WORD_LIST *list;
120{
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000121 int result;
Jari Aaltob80f6442004-07-27 13:29:18 +0000122 char *filename, *debug_trap;
Jari Aalto726f6381996-08-26 18:22:31 +0000123
Jari Aalto7117c2d2002-07-17 14:10:11 +0000124 if (no_options (list))
125 return (EX_USAGE);
126 list = loptend;
127
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000128 if (list == 0)
Jari Aalto726f6381996-08-26 18:22:31 +0000129 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000130 builtin_error (_("filename argument required"));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000131 builtin_usage ();
132 return (EX_USAGE);
Jari Aalto726f6381996-08-26 18:22:31 +0000133 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000134
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000135#if defined (RESTRICTED_SHELL)
136 if (restricted && strchr (list->word->word, '/'))
137 {
Jari Aalto7117c2d2002-07-17 14:10:11 +0000138 sh_restricted (list->word->word);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000139 return (EXECUTION_FAILURE);
140 }
141#endif
142
143 filename = (char *)NULL;
Jari Aalto31859422009-01-12 13:36:28 +0000144 /* XXX -- should this be absolute_pathname? */
145 if (posixly_correct && strchr (list->word->word, '/'))
146 filename = savestring (list->word->word);
147 else if (absolute_pathname (list->word->word))
148 filename = savestring (list->word->word);
149 else if (source_uses_path)
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000150 filename = find_path_file (list->word->word);
151 if (filename == 0)
Jari Aalto28ef6c32001-04-06 19:14:31 +0000152 {
153 if (source_searches_cwd == 0)
154 {
Jari Aaltob80f6442004-07-27 13:29:18 +0000155 builtin_error (_("%s: file not found"), list->word->word);
Chet Ramey495aee42011-11-22 19:11:26 -0500156 if (posixly_correct && interactive_shell == 0 && executing_command_builtin == 0)
157 {
158 last_command_exit_value = 1;
159 jump_to_top_level (EXITPROG);
160 }
Jari Aalto28ef6c32001-04-06 19:14:31 +0000161 return (EXECUTION_FAILURE);
162 }
163 else
164 filename = savestring (list->word->word);
165 }
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000166
167 begin_unwind_frame ("source");
168 add_unwind_protect ((Function *)xfree, filename);
169
170 if (list->next)
171 {
172 push_dollar_vars ();
173 add_unwind_protect ((Function *)maybe_pop_dollar_vars, (char *)NULL);
174 remember_args (list->next, 1);
Jari Aaltob80f6442004-07-27 13:29:18 +0000175 if (debugging_mode)
176 push_args (list->next); /* Update BASH_ARGV and BASH_ARGC */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000177 }
178 set_dollar_vars_unchanged ();
179
Jari Aaltob80f6442004-07-27 13:29:18 +0000180 /* Don't inherit the DEBUG trap unless function_trace_mode (overloaded)
181 is set. XXX - should sourced files inherit the RETURN trap? Functions
182 don't. */
183 debug_trap = TRAP_STRING (DEBUG_TRAP);
184 if (debug_trap && function_trace_mode == 0)
185 {
186 debug_trap = savestring (debug_trap);
187 add_unwind_protect (xfree, debug_trap);
188 add_unwind_protect (set_debug_trap, debug_trap);
189 restore_default_signal (DEBUG_TRAP);
190 }
191
192 result = source_file (filename, (list && list->next));
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000193
194 run_unwind_frame ("source");
195
Jari Aalto726f6381996-08-26 18:22:31 +0000196 return (result);
197}