1 This file is set.def, from which is created set.c.
2 It implements the "set" and "unset" builtins in Bash.
4 Copyright (C) 1987-2004 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 it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
13 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License along
19 with Bash; see the file COPYING. If not, write to the Free Software
20 Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
26 #if defined (HAVE_UNISTD_H)
28 # include <sys/types.h>
35 #include "../bashansi.h"
36 #include "../bashintl.h"
41 #include "bashgetopt.h"
43 #if defined (READLINE)
44 # include "../input.h"
45 # include "../bashline.h"
46 # include <readline/readline.h>
50 # include "../bashhist.h"
53 extern int posixly_correct, ignoreeof, eof_encountered_limit;
55 extern int dont_save_function_defs;
57 #if defined (READLINE)
58 extern int no_line_editing;
63 $SHORT_DOC set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
64 -a Mark variables which are modified or created for export.
65 -b Notify of job termination immediately.
66 -e Exit immediately if a command exits with a non-zero status.
67 -f Disable file name generation (globbing).
68 -h Remember the location of commands as they are looked up.
69 -k All assignment arguments are placed in the environment for a
70 command, not just those that precede the command name.
71 -m Job control is enabled.
72 -n Read commands but do not execute them.
74 Set the variable corresponding to option-name:
76 braceexpand same as -B
77 #if defined (READLINE)
78 emacs use an emacs-style line editing interface
84 #if defined (BANG_HISTORY)
86 #endif /* BANG_HISTORY */
88 history enable command history
90 ignoreeof the shell will not exit upon reading EOF
92 allow comments to appear in interactive commands
98 nolog currently accepted but ignored
103 pipefail the return value of a pipeline is the status of
104 the last command to exit with a non-zero status,
105 or zero if no command exited with a non-zero status
106 posix change the behavior of bash where the default
107 operation differs from the 1003.2 standard to
109 privileged same as -p
111 #if defined (READLINE)
112 vi use a vi-style line editing interface
113 #endif /* READLINE */
115 -p Turned on whenever the real and effective user ids do not match.
116 Disables processing of the $ENV file and importing of shell
117 functions. Turning this option off causes the effective uid and
118 gid to be set to the real uid and gid.
119 -t Exit after reading and executing one command.
120 -u Treat unset variables as an error when substituting.
121 -v Print shell input lines as they are read.
122 -x Print commands and their arguments as they are executed.
123 #if defined (BRACE_EXPANSION)
124 -B the shell will perform brace expansion
125 #endif /* BRACE_EXPANSION */
126 -C If set, disallow existing regular files to be overwritten
127 by redirection of output.
128 -E If set, the ERR trap is inherited by shell functions.
129 #if defined (BANG_HISTORY)
130 -H Enable ! style history substitution. This flag is on
131 by default when the shell is interactive.
132 #endif /* BANG_HISTORY */
133 -P If set, do not follow symbolic links when executing commands
134 such as cd which change the current directory.
135 -T If set, the DEBUG trap is inherited by shell functions.
136 - Assign any remaining arguments to the positional parameters.
137 The -x and -v options are turned off.
139 Using + rather than - causes these flags to be turned off. The
140 flags can also be used upon invocation of the shell. The current
141 set of flags may be found in $-. The remaining n ARGs are positional
142 parameters and are assigned, in order, to $1, $2, .. $n. If no
143 ARGs are given, all shell variables are printed.
146 typedef int setopt_set_func_t __P((int, char *));
147 typedef int setopt_get_func_t __P((char *));
149 static void print_minus_o_option __P((char *, int, int));
150 static void print_all_shell_variables __P((void));
152 static int set_ignoreeof __P((int, char *));
153 static int set_posix_mode __P((int, char *));
155 #if defined (READLINE)
156 static int set_edit_mode __P((int, char *));
157 static int get_edit_mode __P((char *));
160 #if defined (HISTORY)
161 static int bash_set_history __P((int, char *));
164 static char *on = "on";
165 static char *off = "off";
167 /* A struct used to match long options for set -o to the corresponding
168 option letter or internal variable. The functions can be called to
169 dynamically generate values. */
174 setopt_set_func_t *set_func;
175 setopt_get_func_t *get_func;
177 { "allexport", 'a', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
178 #if defined (BRACE_EXPANSION)
179 { "braceexpand",'B', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
181 #if defined (READLINE)
182 { "emacs", '\0', (int *)NULL, set_edit_mode, get_edit_mode },
184 { "errexit", 'e', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
185 { "errtrace", 'E', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
186 { "functrace", 'T', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
187 { "hashall", 'h', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
188 #if defined (BANG_HISTORY)
189 { "histexpand", 'H', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
190 #endif /* BANG_HISTORY */
191 #if defined (HISTORY)
192 { "history", '\0', &enable_history_list, bash_set_history, (setopt_get_func_t *)NULL },
194 { "ignoreeof", '\0', &ignoreeof, set_ignoreeof, (setopt_get_func_t *)NULL },
195 { "interactive-comments", '\0', &interactive_comments, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
196 { "keyword", 'k', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
197 { "monitor", 'm', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
198 { "noclobber", 'C', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
199 { "noexec", 'n', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
200 { "noglob", 'f', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
201 #if defined (HISTORY)
202 { "nolog", '\0', &dont_save_function_defs, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
204 #if defined (JOB_CONTROL)
205 { "notify", 'b', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
206 #endif /* JOB_CONTROL */
207 { "nounset", 'u', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
208 { "onecmd", 't', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
209 { "physical", 'P', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
210 { "pipefail", '\0', &pipefail_opt, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
211 { "posix", '\0', &posixly_correct, set_posix_mode, (setopt_get_func_t *)NULL },
212 { "privileged", 'p', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
213 { "verbose", 'v', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
214 #if defined (READLINE)
215 { "vi", '\0', (int *)NULL, set_edit_mode, get_edit_mode },
217 { "xtrace", 'x', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
218 {(char *)NULL, 0 , (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
221 #define N_O_OPTIONS (sizeof (o_options) / sizeof (o_options[0]))
223 #define GET_BINARY_O_OPTION_VALUE(i, name) \
224 ((o_options[i].get_func) ? (*o_options[i].get_func) (name) \
225 : (*o_options[i].variable))
227 #define SET_BINARY_O_OPTION_VALUE(i, onoff, name) \
228 ((o_options[i].set_func) ? (*o_options[i].set_func) (onoff, name) \
229 : (*o_options[i].variable = (onoff == FLAG_ON)))
232 minus_o_option_value (name)
238 for (i = 0; o_options[i].name; i++)
240 if (STREQ (name, o_options[i].name))
242 if (o_options[i].letter)
244 on_or_off = find_flag (o_options[i].letter);
245 return ((on_or_off == FLAG_UNKNOWN) ? -1 : *on_or_off);
248 return (GET_BINARY_O_OPTION_VALUE (i, name));
255 #define MINUS_O_FORMAT "%-15s\t%s\n"
258 print_minus_o_option (name, value, pflag)
263 printf (MINUS_O_FORMAT, name, value ? on : off);
265 printf ("set %co %s\n", value ? '-' : '+', name);
269 list_minus_o_opts (mode, reusable)
273 int *on_or_off, value;
275 for (i = 0; o_options[i].name; i++)
277 if (o_options[i].letter)
280 on_or_off = find_flag (o_options[i].letter);
281 if (on_or_off == FLAG_UNKNOWN)
283 if (mode == -1 || mode == *on_or_off)
284 print_minus_o_option (o_options[i].name, *on_or_off, reusable);
288 value = GET_BINARY_O_OPTION_VALUE (i, o_options[i].name);
289 if (mode == -1 || mode == value)
290 print_minus_o_option (o_options[i].name, value, reusable);
301 ret = strvec_create (N_O_OPTIONS + 1);
302 for (i = 0; o_options[i].name; i++)
303 ret[i] = o_options[i].name;
304 ret[i] = (char *)NULL;
309 set_ignoreeof (on_or_off, option_name)
313 ignoreeof = on_or_off == FLAG_ON;
314 unbind_variable ("ignoreeof");
316 bind_variable ("IGNOREEOF", "10", 0);
318 unbind_variable ("IGNOREEOF");
319 sv_ignoreeof ("IGNOREEOF");
324 set_posix_mode (on_or_off, option_name)
328 posixly_correct = on_or_off == FLAG_ON;
329 if (posixly_correct == 0)
330 unbind_variable ("POSIXLY_CORRECT");
332 bind_variable ("POSIXLY_CORRECT", "y", 0);
333 sv_strict_posix ("POSIXLY_CORRECT");
337 #if defined (READLINE)
338 /* Magic. This code `knows' how readline handles rl_editing_mode. */
340 set_edit_mode (on_or_off, option_name)
346 if (on_or_off == FLAG_ON)
348 rl_variable_bind ("editing-mode", option_name);
351 with_input_from_stdin ();
356 isemacs = rl_editing_mode == 1;
357 if ((isemacs && *option_name == 'e') || (!isemacs && *option_name == 'v'))
360 with_input_from_stream (stdin, "stdin");
364 return 1-no_line_editing;
371 return (*name == 'e' ? no_line_editing == 0 && rl_editing_mode == 1
372 : no_line_editing == 0 && rl_editing_mode == 0);
374 #endif /* READLINE */
376 #if defined (HISTORY)
378 bash_set_history (on_or_off, option_name)
382 if (on_or_off == FLAG_ON)
384 enable_history_list = 1;
385 bash_history_enable ();
386 if (history_lines_this_session == 0)
391 enable_history_list = 0;
392 bash_history_disable ();
394 return (1 - enable_history_list);
399 set_minus_o_option (on_or_off, option_name)
405 for (i = 0; o_options[i].name; i++)
407 if (STREQ (option_name, o_options[i].name))
409 if (o_options[i].letter == 0)
411 SET_BINARY_O_OPTION_VALUE (i, on_or_off, option_name);
412 return (EXECUTION_SUCCESS);
416 if (change_flag (o_options[i].letter, on_or_off) == FLAG_ERROR)
418 sh_invalidoptname (option_name);
419 return (EXECUTION_FAILURE);
422 return (EXECUTION_SUCCESS);
428 sh_invalidoptname (option_name);
429 return (EXECUTION_FAILURE);
433 print_all_shell_variables ()
437 vars = all_shell_variables ();
440 print_var_list (vars);
444 /* POSIX.2 does not allow function names and definitions to be output when
445 `set' is invoked without options (PASC Interp #202). */
446 if (posixly_correct == 0)
448 vars = all_shell_functions ();
451 print_func_list (vars);
461 char tflag[N_O_OPTIONS];
462 int vsize, i, vptr, *ip, exported;
465 for (vsize = i = 0; o_options[i].name; i++)
468 if (o_options[i].letter)
470 ip = find_flag (o_options[i].letter);
473 vsize += strlen (o_options[i].name) + 1;
477 else if (GET_BINARY_O_OPTION_VALUE (i, o_options[i].name))
479 vsize += strlen (o_options[i].name) + 1;
484 value = (char *)xmalloc (vsize + 1);
486 for (i = vptr = 0; o_options[i].name; i++)
490 strcpy (value + vptr, o_options[i].name);
491 vptr += strlen (o_options[i].name);
497 vptr--; /* cut off trailing colon */
500 v = find_variable ("SHELLOPTS");
502 /* Turn off the read-only attribute so we can bind the new value, and
503 note whether or not the variable was exported. */
506 VUNSETATTR (v, att_readonly);
507 exported = exported_p (v);
512 v = bind_variable ("SHELLOPTS", value, 0);
514 /* Turn the read-only attribute back on, and turn off the export attribute
515 if it was set implicitly by mark_modified_vars and SHELLOPTS was not
516 exported before we bound the new value. */
517 VSETATTR (v, att_readonly);
518 if (mark_modified_vars && exported == 0 && exported_p (v))
519 VUNSETATTR (v, att_exported);
525 parse_shellopts (value)
532 while (vname = extract_colon_unit (value, &vptr))
534 set_minus_o_option (FLAG_ON, vname);
540 initialize_shell_options (no_shellopts)
546 if (no_shellopts == 0)
548 var = find_variable ("SHELLOPTS");
549 /* set up any shell options we may have inherited. */
550 if (var && imported_p (var))
552 temp = (array_p (var)) ? (char *)NULL : savestring (value_cell (var));
555 parse_shellopts (temp);
561 /* Set up the $SHELLOPTS variable. */
565 /* Reset the values of the -o options that are not also shell flags. This is
566 called from execute_cmd.c:initialize_subshell() when setting up a subshell
567 to run an executable shell script without a leading `#!'. */
569 reset_shell_options ()
571 #if defined (HISTORY)
572 remember_on_history = enable_history_list = 1;
577 /* Set some flags from the word values in the input list. If LIST is empty,
578 then print out the values of the variables instead. If LIST contains
579 non-flags, then set $1 - $9 to the successive words of LIST. */
584 int on_or_off, flag_name, force_assignment, opts_changed;
590 print_all_shell_variables ();
591 return (EXECUTION_SUCCESS);
594 /* Check validity of flag arguments. */
595 reset_internal_getopt ();
596 while ((flag_name = internal_getopt (list, optflags)) != -1)
602 return (list_optopt == '?' ? EXECUTION_SUCCESS : EX_USAGE);
608 /* Do the set command. While the list consists of words starting with
609 '-' or '+' treat them as flags, otherwise, start assigning them to
611 for (force_assignment = opts_changed = 0; list; )
613 arg = list->word->word;
615 /* If the argument is `--' or `-' then signal the end of the list
616 and remember the remaining arguments. */
617 if (arg[0] == '-' && (!arg[1] || (arg[1] == '-' && !arg[2])))
621 /* `set --' unsets the positional parameters. */
623 force_assignment = 1;
625 /* Until told differently, the old shell behaviour of
626 `set - [arg ...]' being equivalent to `set +xv [arg ...]'
627 stands. Posix.2 says the behaviour is marked as obsolescent. */
630 change_flag ('x', '+');
631 change_flag ('v', '+');
638 if ((on_or_off = *arg) && (on_or_off == '-' || on_or_off == '+'))
640 while (flag_name = *++arg)
642 if (flag_name == '?')
645 return (EXECUTION_SUCCESS);
647 else if (flag_name == 'o') /* -+o option-name */
656 list_minus_o_opts (-1, (on_or_off == '+'));
660 option_name = opt->word->word;
662 if (option_name == 0 || *option_name == '\0' ||
663 *option_name == '-' || *option_name == '+')
665 list_minus_o_opts (-1, (on_or_off == '+'));
668 list = list->next; /* Skip over option name. */
671 if (set_minus_o_option (on_or_off, option_name) != EXECUTION_SUCCESS)
674 return (EXECUTION_FAILURE);
677 else if (change_flag (flag_name, on_or_off) == FLAG_ERROR)
685 return (EXECUTION_FAILURE);
697 /* Assigning $1 ... $n */
698 if (list || force_assignment)
699 remember_args (list, 1);
700 /* Set up new value of $SHELLOPTS */
703 return (EXECUTION_SUCCESS);
707 $FUNCTION unset_builtin
708 $SHORT_DOC unset [-f] [-v] [name ...]
709 For each NAME, remove the corresponding variable or function. Given
710 the `-v', unset will only act on variables. Given the `-f' flag,
711 unset will only act on functions. With neither flag, unset first
712 tries to unset a variable, and if that fails, then tries to unset a
713 function. Some variables cannot be unset; also see readonly.
716 #define NEXT_VARIABLE() any_failed++; list = list->next; continue;
722 int unset_function, unset_variable, unset_array, opt, any_failed;
725 unset_function = unset_variable = unset_array = any_failed = 0;
727 reset_internal_getopt ();
728 while ((opt = internal_getopt (list, "fv")) != -1)
746 if (unset_function && unset_variable)
748 builtin_error (_("cannot simultaneously unset a function and a variable"));
749 return (EXECUTION_FAILURE);
756 #if defined (ARRAY_VARS)
760 name = list->word->word;
762 #if defined (ARRAY_VARS)
764 if (!unset_function && valid_array_reference (name))
766 t = strchr (name, '[');
772 /* Bash allows functions with names which are not valid identifiers
773 to be created when not in posix mode, so check only when in posix
774 mode when unsetting a function. */
775 if (((unset_function && posixly_correct) || !unset_function) && legal_identifier (name) == 0)
781 var = unset_function ? find_function (name) : find_variable (name);
783 if (var && !unset_function && non_unsettable_p (var))
785 builtin_error (_("%s: cannot unset"), name);
789 /* Posix.2 says that unsetting readonly variables is an error. */
790 if (var && readonly_p (var))
792 builtin_error (_("%s: cannot unset: readonly %s"),
793 name, unset_function ? "function" : "variable");
797 /* Unless the -f option is supplied, the name refers to a variable. */
798 #if defined (ARRAY_VARS)
799 if (var && unset_array)
801 if (array_p (var) == 0)
803 builtin_error (_("%s: not an array variable"), name);
808 tem = unbind_array_element (var, t);
814 #endif /* ARRAY_VARS */
815 tem = unset_function ? unbind_func (name) : unbind_variable (name);
817 /* This is what Posix.2 draft 11+ says. ``If neither -f nor -v
818 is specified, the name refers to a variable; if a variable by
819 that name does not exist, a function by that name, if any,
821 if (tem == -1 && !unset_function && !unset_variable)
822 tem = unbind_func (name);
824 /* SUSv3, POSIX.1-2001 say: ``Unsetting a variable or function that
825 was not previously set shall not be considered an error.'' */
827 if (unset_function == 0)
828 stupidly_hack_special_variables (name);
833 return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS);