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', &remember_on_history, 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 bash_history_enable ();
385 if (history_lines_this_session == 0)
389 bash_history_disable ();
390 return (1 - remember_on_history);
395 set_minus_o_option (on_or_off, option_name)
401 for (i = 0; o_options[i].name; i++)
403 if (STREQ (option_name, o_options[i].name))
405 if (o_options[i].letter == 0)
407 SET_BINARY_O_OPTION_VALUE (i, on_or_off, option_name);
408 return (EXECUTION_SUCCESS);
412 if (change_flag (o_options[i].letter, on_or_off) == FLAG_ERROR)
414 sh_invalidoptname (option_name);
415 return (EXECUTION_FAILURE);
418 return (EXECUTION_SUCCESS);
424 sh_invalidoptname (option_name);
425 return (EXECUTION_FAILURE);
429 print_all_shell_variables ()
433 vars = all_shell_variables ();
436 print_var_list (vars);
440 /* POSIX.2 does not allow function names and definitions to be output when
441 `set' is invoked without options (PASC Interp #202). */
442 if (posixly_correct == 0)
444 vars = all_shell_functions ();
447 print_func_list (vars);
457 char tflag[N_O_OPTIONS];
458 int vsize, i, vptr, *ip, exported;
461 for (vsize = i = 0; o_options[i].name; i++)
464 if (o_options[i].letter)
466 ip = find_flag (o_options[i].letter);
469 vsize += strlen (o_options[i].name) + 1;
473 else if (GET_BINARY_O_OPTION_VALUE (i, o_options[i].name))
475 vsize += strlen (o_options[i].name) + 1;
480 value = (char *)xmalloc (vsize + 1);
482 for (i = vptr = 0; o_options[i].name; i++)
486 strcpy (value + vptr, o_options[i].name);
487 vptr += strlen (o_options[i].name);
493 vptr--; /* cut off trailing colon */
496 v = find_variable ("SHELLOPTS");
498 /* Turn off the read-only attribute so we can bind the new value, and
499 note whether or not the variable was exported. */
502 VUNSETATTR (v, att_readonly);
503 exported = exported_p (v);
508 v = bind_variable ("SHELLOPTS", value, 0);
510 /* Turn the read-only attribute back on, and turn off the export attribute
511 if it was set implicitly by mark_modified_vars and SHELLOPTS was not
512 exported before we bound the new value. */
513 VSETATTR (v, att_readonly);
514 if (mark_modified_vars && exported == 0 && exported_p (v))
515 VUNSETATTR (v, att_exported);
521 parse_shellopts (value)
528 while (vname = extract_colon_unit (value, &vptr))
530 set_minus_o_option (FLAG_ON, vname);
536 initialize_shell_options (no_shellopts)
542 if (no_shellopts == 0)
544 var = find_variable ("SHELLOPTS");
545 /* set up any shell options we may have inherited. */
546 if (var && imported_p (var))
548 temp = (array_p (var)) ? (char *)NULL : savestring (value_cell (var));
551 parse_shellopts (temp);
557 /* Set up the $SHELLOPTS variable. */
561 /* Reset the values of the -o options that are not also shell flags. This is
562 called from execute_cmd.c:initialize_subshell() when setting up a subshell
563 to run an executable shell script without a leading `#!'. */
565 reset_shell_options ()
567 #if defined (HISTORY)
568 remember_on_history = 1;
573 /* Set some flags from the word values in the input list. If LIST is empty,
574 then print out the values of the variables instead. If LIST contains
575 non-flags, then set $1 - $9 to the successive words of LIST. */
580 int on_or_off, flag_name, force_assignment, opts_changed;
586 print_all_shell_variables ();
587 return (EXECUTION_SUCCESS);
590 /* Check validity of flag arguments. */
591 reset_internal_getopt ();
592 while ((flag_name = internal_getopt (list, optflags)) != -1)
598 return (list_optopt == '?' ? EXECUTION_SUCCESS : EX_USAGE);
604 /* Do the set command. While the list consists of words starting with
605 '-' or '+' treat them as flags, otherwise, start assigning them to
607 for (force_assignment = opts_changed = 0; list; )
609 arg = list->word->word;
611 /* If the argument is `--' or `-' then signal the end of the list
612 and remember the remaining arguments. */
613 if (arg[0] == '-' && (!arg[1] || (arg[1] == '-' && !arg[2])))
617 /* `set --' unsets the positional parameters. */
619 force_assignment = 1;
621 /* Until told differently, the old shell behaviour of
622 `set - [arg ...]' being equivalent to `set +xv [arg ...]'
623 stands. Posix.2 says the behaviour is marked as obsolescent. */
626 change_flag ('x', '+');
627 change_flag ('v', '+');
634 if ((on_or_off = *arg) && (on_or_off == '-' || on_or_off == '+'))
636 while (flag_name = *++arg)
638 if (flag_name == '?')
641 return (EXECUTION_SUCCESS);
643 else if (flag_name == 'o') /* -+o option-name */
652 list_minus_o_opts (-1, (on_or_off == '+'));
656 option_name = opt->word->word;
658 if (option_name == 0 || *option_name == '\0' ||
659 *option_name == '-' || *option_name == '+')
661 list_minus_o_opts (-1, (on_or_off == '+'));
664 list = list->next; /* Skip over option name. */
667 if (set_minus_o_option (on_or_off, option_name) != EXECUTION_SUCCESS)
670 return (EXECUTION_FAILURE);
673 else if (change_flag (flag_name, on_or_off) == FLAG_ERROR)
681 return (EXECUTION_FAILURE);
693 /* Assigning $1 ... $n */
694 if (list || force_assignment)
695 remember_args (list, 1);
696 /* Set up new value of $SHELLOPTS */
699 return (EXECUTION_SUCCESS);
703 $FUNCTION unset_builtin
704 $SHORT_DOC unset [-f] [-v] [name ...]
705 For each NAME, remove the corresponding variable or function. Given
706 the `-v', unset will only act on variables. Given the `-f' flag,
707 unset will only act on functions. With neither flag, unset first
708 tries to unset a variable, and if that fails, then tries to unset a
709 function. Some variables cannot be unset; also see readonly.
712 #define NEXT_VARIABLE() any_failed++; list = list->next; continue;
718 int unset_function, unset_variable, unset_array, opt, any_failed;
721 unset_function = unset_variable = unset_array = any_failed = 0;
723 reset_internal_getopt ();
724 while ((opt = internal_getopt (list, "fv")) != -1)
742 if (unset_function && unset_variable)
744 builtin_error (_("cannot simultaneously unset a function and a variable"));
745 return (EXECUTION_FAILURE);
752 #if defined (ARRAY_VARS)
756 name = list->word->word;
758 #if defined (ARRAY_VARS)
760 if (!unset_function && valid_array_reference (name))
762 t = strchr (name, '[');
768 /* Bash allows functions with names which are not valid identifiers
769 to be created when not in posix mode, so check only when in posix
770 mode when unsetting a function. */
771 if (((unset_function && posixly_correct) || !unset_function) && legal_identifier (name) == 0)
777 var = unset_function ? find_function (name) : find_variable (name);
779 if (var && !unset_function && non_unsettable_p (var))
781 builtin_error (_("%s: cannot unset"), name);
785 /* Posix.2 says that unsetting readonly variables is an error. */
786 if (var && readonly_p (var))
788 builtin_error (_("%s: cannot unset: readonly %s"),
789 name, unset_function ? "function" : "variable");
793 /* Unless the -f option is supplied, the name refers to a variable. */
794 #if defined (ARRAY_VARS)
795 if (var && unset_array)
797 if (array_p (var) == 0)
799 builtin_error (_("%s: not an array variable"), name);
804 tem = unbind_array_element (var, t);
810 #endif /* ARRAY_VARS */
811 tem = unset_function ? unbind_func (name) : unbind_variable (name);
813 /* This is what Posix.2 draft 11+ says. ``If neither -f nor -v
814 is specified, the name refers to a variable; if a variable by
815 that name does not exist, a function by that name, if any,
817 if (tem == -1 && !unset_function && !unset_variable)
818 tem = unbind_func (name);
820 /* SUSv3, POSIX.1-2001 say: ``Unsetting a variable or function that
821 was not previously set shall not be considered an error.'' */
823 if (unset_function == 0)
824 stupidly_hack_special_variables (name);
829 return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS);