Added gitignore entries needed to ignore derived objects generated from full build...
[bash.git] / builtins / source.def
blob71908b8bf579b7ad44d61747366cbc021da8ce2d
1 This file is source.def, from which is created source.c.
2 It implements the builtins "." and "source" in Bash.
4 Copyright (C) 1987-2009 Free Software Foundation, Inc.
6 This file is part of GNU Bash, the Bourne Again SHell.
8 Bash is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 Bash is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with Bash. If not, see <http://www.gnu.org/licenses/>.
21 $PRODUCES source.c
23 $BUILTIN source
24 $FUNCTION source_builtin
25 $SHORT_DOC source filename [arguments]
26 Execute commands from a file in the current shell.
28 Read and execute commands from FILENAME in the current shell. The
29 entries in $PATH are used to find the directory containing FILENAME.
30 If any ARGUMENTS are supplied, they become the positional parameters
31 when FILENAME is executed.
33 Exit Status:
34 Returns the status of the last command executed in FILENAME; fails if
35 FILENAME cannot be read.
36 $END
38 $BUILTIN .
39 $DOCNAME dot
40 $FUNCTION source_builtin
41 $SHORT_DOC . filename [arguments]
42 Execute commands from a file in the current shell.
44 Read and execute commands from FILENAME in the current shell. The
45 entries in $PATH are used to find the directory containing FILENAME.
46 If any ARGUMENTS are supplied, they become the positional parameters
47 when FILENAME is executed.
49 Exit Status:
50 Returns the status of the last command executed in FILENAME; fails if
51 FILENAME cannot be read.
52 $END
54 #include <config.h>
56 #include "../bashtypes.h"
57 #include "posixstat.h"
58 #include "filecntl.h"
59 #if ! defined(_MINIX) && defined (HAVE_SYS_FILE_H)
60 # include <sys/file.h>
61 #endif
62 #include <errno.h>
64 #if defined (HAVE_UNISTD_H)
65 # include <unistd.h>
66 #endif
68 #include "../bashansi.h"
69 #include "../bashintl.h"
71 #include "../shell.h"
72 #include "../flags.h"
73 #include "../findcmd.h"
74 #include "common.h"
75 #include "bashgetopt.h"
76 #include "../trap.h"
78 #if !defined (errno)
79 extern int errno;
80 #endif /* !errno */
82 extern int posixly_correct;
83 extern int last_command_exit_value;
84 extern int executing_command_builtin;
86 static void maybe_pop_dollar_vars __P((void));
88 /* If non-zero, `.' uses $PATH to look up the script to be sourced. */
89 int source_uses_path = 1;
91 /* If non-zero, `.' looks in the current directory if the filename argument
92 is not found in the $PATH. */
93 int source_searches_cwd = 1;
95 /* 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
98 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. */
101 static void
102 maybe_pop_dollar_vars ()
104 if (variable_context == 0 && (dollar_vars_changed () & ARGS_SETBLTIN))
105 dispose_saved_dollar_vars ();
106 else
107 pop_dollar_vars ();
108 if (debugging_mode)
109 pop_args (); /* restore BASH_ARGC and BASH_ARGV */
110 set_dollar_vars_unchanged ();
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. */
118 source_builtin (list)
119 WORD_LIST *list;
121 int result;
122 char *filename, *debug_trap;
124 if (no_options (list))
125 return (EX_USAGE);
126 list = loptend;
128 if (list == 0)
130 builtin_error (_("filename argument required"));
131 builtin_usage ();
132 return (EX_USAGE);
135 #if defined (RESTRICTED_SHELL)
136 if (restricted && strchr (list->word->word, '/'))
138 sh_restricted (list->word->word);
139 return (EXECUTION_FAILURE);
141 #endif
143 filename = (char *)NULL;
144 /* 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)
150 filename = find_path_file (list->word->word);
151 if (filename == 0)
153 if (source_searches_cwd == 0)
155 builtin_error (_("%s: file not found"), list->word->word);
156 if (posixly_correct && interactive_shell == 0 && executing_command_builtin == 0)
158 last_command_exit_value = 1;
159 jump_to_top_level (EXITPROG);
161 return (EXECUTION_FAILURE);
163 else
164 filename = savestring (list->word->word);
167 begin_unwind_frame ("source");
168 add_unwind_protect ((Function *)xfree, filename);
170 if (list->next)
172 push_dollar_vars ();
173 add_unwind_protect ((Function *)maybe_pop_dollar_vars, (char *)NULL);
174 remember_args (list->next, 1);
175 if (debugging_mode)
176 push_args (list->next); /* Update BASH_ARGV and BASH_ARGC */
178 set_dollar_vars_unchanged ();
180 /* 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)
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);
192 result = source_file (filename, (list && list->next));
194 run_unwind_frame ("source");
196 return (result);