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-2008 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-name] [arg ...]
64 Changes the value of shell attributes and positional parameters, or
65 displays the names and values of shell variables.
68 -a Mark variables which are modified or created for export.
69 -b Notify of job termination immediately.
70 -e Exit immediately if a command exits with a non-zero status.
71 -f Disable file name generation (globbing).
72 -h Remember the location of commands as they are looked up.
73 -k All assignment arguments are placed in the environment for a
74 command, not just those that precede the command name.
75 -m Job control is enabled.
76 -n Read commands but do not execute them.
78 Set the variable corresponding to option-name:
80 braceexpand same as -B
81 #if defined (READLINE)
82 emacs use an emacs-style line editing interface
88 #if defined (BANG_HISTORY)
90 #endif /* BANG_HISTORY */
92 history enable command history
94 ignoreeof the shell will not exit upon reading EOF
96 allow comments to appear in interactive commands
102 nolog currently accepted but ignored
107 pipefail the return value of a pipeline is the status of
108 the last command to exit with a non-zero status,
109 or zero if no command exited with a non-zero status
110 posix change the behavior of bash where the default
111 operation differs from the Posix standard to
113 privileged same as -p
115 #if defined (READLINE)
116 vi use a vi-style line editing interface
117 #endif /* READLINE */
119 -p Turned on whenever the real and effective user ids do not match.
120 Disables processing of the $ENV file and importing of shell
121 functions. Turning this option off causes the effective uid and
122 gid to be set to the real uid and gid.
123 -t Exit after reading and executing one command.
124 -u Treat unset variables as an error when substituting.
125 -v Print shell input lines as they are read.
126 -x Print commands and their arguments as they are executed.
127 #if defined (BRACE_EXPANSION)
128 -B the shell will perform brace expansion
129 #endif /* BRACE_EXPANSION */
130 -C If set, disallow existing regular files to be overwritten
131 by redirection of output.
132 -E If set, the ERR trap is inherited by shell functions.
133 #if defined (BANG_HISTORY)
134 -H Enable ! style history substitution. This flag is on
135 by default when the shell is interactive.
136 #endif /* BANG_HISTORY */
137 -P If set, do not follow symbolic links when executing commands
138 such as cd which change the current directory.
139 -T If set, the DEBUG trap is inherited by shell functions.
140 - Assign any remaining arguments to the positional parameters.
141 The -x and -v options are turned off.
143 Using + rather than - causes these flags to be turned off. The
144 flags can also be used upon invocation of the shell. The current
145 set of flags may be found in $-. The remaining n ARGs are positional
146 parameters and are assigned, in order, to $1, $2, .. $n. If no
147 ARGs are given, all shell variables are printed.
150 typedef int setopt_set_func_t __P((int, char *));
151 typedef int setopt_get_func_t __P((char *));
153 static void print_minus_o_option __P((char *, int, int));
154 static void print_all_shell_variables __P((void));
156 static int set_ignoreeof __P((int, char *));
157 static int set_posix_mode __P((int, char *));
159 #if defined (READLINE)
160 static int set_edit_mode __P((int, char *));
161 static int get_edit_mode __P((char *));
164 #if defined (HISTORY)
165 static int bash_set_history __P((int, char *));
168 static const char * const on = "on";
169 static const char * const off = "off";
171 /* A struct used to match long options for set -o to the corresponding
172 option letter or internal variable. The functions can be called to
173 dynamically generate values. */
178 setopt_set_func_t *set_func;
179 setopt_get_func_t *get_func;
181 { "allexport", 'a', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
182 #if defined (BRACE_EXPANSION)
183 { "braceexpand",'B', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
185 #if defined (READLINE)
186 { "emacs", '\0', (int *)NULL, set_edit_mode, get_edit_mode },
188 { "errexit", 'e', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
189 { "errtrace", 'E', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
190 { "functrace", 'T', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
191 { "hashall", 'h', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
192 #if defined (BANG_HISTORY)
193 { "histexpand", 'H', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
194 #endif /* BANG_HISTORY */
195 #if defined (HISTORY)
196 { "history", '\0', &remember_on_history, bash_set_history, (setopt_get_func_t *)NULL },
198 { "ignoreeof", '\0', &ignoreeof, set_ignoreeof, (setopt_get_func_t *)NULL },
199 { "interactive-comments", '\0', &interactive_comments, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
200 { "keyword", 'k', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
201 { "monitor", 'm', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
202 { "noclobber", 'C', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
203 { "noexec", 'n', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
204 { "noglob", 'f', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
205 #if defined (HISTORY)
206 { "nolog", '\0', &dont_save_function_defs, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
208 #if defined (JOB_CONTROL)
209 { "notify", 'b', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
210 #endif /* JOB_CONTROL */
211 { "nounset", 'u', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
212 { "onecmd", 't', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
213 { "physical", 'P', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
214 { "pipefail", '\0', &pipefail_opt, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
215 { "posix", '\0', &posixly_correct, set_posix_mode, (setopt_get_func_t *)NULL },
216 { "privileged", 'p', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
217 { "verbose", 'v', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
218 #if defined (READLINE)
219 { "vi", '\0', (int *)NULL, set_edit_mode, get_edit_mode },
221 { "xtrace", 'x', (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
222 {(char *)NULL, 0 , (int *)NULL, (setopt_set_func_t *)NULL, (setopt_get_func_t *)NULL },
225 #define N_O_OPTIONS (sizeof (o_options) / sizeof (o_options[0]))
227 #define GET_BINARY_O_OPTION_VALUE(i, name) \
228 ((o_options[i].get_func) ? (*o_options[i].get_func) (name) \
229 : (*o_options[i].variable))
231 #define SET_BINARY_O_OPTION_VALUE(i, onoff, name) \
232 ((o_options[i].set_func) ? (*o_options[i].set_func) (onoff, name) \
233 : (*o_options[i].variable = (onoff == FLAG_ON)))
236 minus_o_option_value (name)
242 for (i = 0; o_options[i].name; i++)
244 if (STREQ (name, o_options[i].name))
246 if (o_options[i].letter)
248 on_or_off = find_flag (o_options[i].letter);
249 return ((on_or_off == FLAG_UNKNOWN) ? -1 : *on_or_off);
252 return (GET_BINARY_O_OPTION_VALUE (i, name));
259 #define MINUS_O_FORMAT "%-15s\t%s\n"
262 print_minus_o_option (name, value, pflag)
267 printf (MINUS_O_FORMAT, name, value ? on : off);
269 printf ("set %co %s\n", value ? '-' : '+', name);
273 list_minus_o_opts (mode, reusable)
277 int *on_or_off, value;
279 for (i = 0; o_options[i].name; i++)
281 if (o_options[i].letter)
284 on_or_off = find_flag (o_options[i].letter);
285 if (on_or_off == FLAG_UNKNOWN)
287 if (mode == -1 || mode == *on_or_off)
288 print_minus_o_option (o_options[i].name, *on_or_off, reusable);
292 value = GET_BINARY_O_OPTION_VALUE (i, o_options[i].name);
293 if (mode == -1 || mode == value)
294 print_minus_o_option (o_options[i].name, value, reusable);
305 ret = strvec_create (N_O_OPTIONS + 1);
306 for (i = 0; o_options[i].name; i++)
307 ret[i] = o_options[i].name;
308 ret[i] = (char *)NULL;
313 set_ignoreeof (on_or_off, option_name)
317 ignoreeof = on_or_off == FLAG_ON;
318 unbind_variable ("ignoreeof");
320 bind_variable ("IGNOREEOF", "10", 0);
322 unbind_variable ("IGNOREEOF");
323 sv_ignoreeof ("IGNOREEOF");
328 set_posix_mode (on_or_off, option_name)
332 posixly_correct = on_or_off == FLAG_ON;
333 if (posixly_correct == 0)
334 unbind_variable ("POSIXLY_CORRECT");
336 bind_variable ("POSIXLY_CORRECT", "y", 0);
337 sv_strict_posix ("POSIXLY_CORRECT");
341 #if defined (READLINE)
342 /* Magic. This code `knows' how readline handles rl_editing_mode. */
344 set_edit_mode (on_or_off, option_name)
350 if (on_or_off == FLAG_ON)
352 rl_variable_bind ("editing-mode", option_name);
355 with_input_from_stdin ();
360 isemacs = rl_editing_mode == 1;
361 if ((isemacs && *option_name == 'e') || (!isemacs && *option_name == 'v'))
364 with_input_from_stream (stdin, "stdin");
368 return 1-no_line_editing;
375 return (*name == 'e' ? no_line_editing == 0 && rl_editing_mode == 1
376 : no_line_editing == 0 && rl_editing_mode == 0);
378 #endif /* READLINE */
380 #if defined (HISTORY)
382 bash_set_history (on_or_off, option_name)
386 if (on_or_off == FLAG_ON)
388 bash_history_enable ();
389 if (history_lines_this_session == 0)
393 bash_history_disable ();
394 return (1 - remember_on_history);
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);
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 = 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, rv, r;
590 print_all_shell_variables ();
591 return (sh_chkwrite (EXECUTION_SUCCESS));
594 /* Check validity of flag arguments. */
595 rv = EXECUTION_SUCCESS;
596 reset_internal_getopt ();
597 while ((flag_name = internal_getopt (list, optflags)) != -1)
603 return (list_optopt == '?' ? EXECUTION_SUCCESS : EX_USAGE);
609 /* Do the set command. While the list consists of words starting with
610 '-' or '+' treat them as flags, otherwise, start assigning them to
612 for (force_assignment = opts_changed = 0; list; )
614 arg = list->word->word;
616 /* If the argument is `--' or `-' then signal the end of the list
617 and remember the remaining arguments. */
618 if (arg[0] == '-' && (!arg[1] || (arg[1] == '-' && !arg[2])))
622 /* `set --' unsets the positional parameters. */
624 force_assignment = 1;
626 /* Until told differently, the old shell behaviour of
627 `set - [arg ...]' being equivalent to `set +xv [arg ...]'
628 stands. Posix.2 says the behaviour is marked as obsolescent. */
631 change_flag ('x', '+');
632 change_flag ('v', '+');
639 if ((on_or_off = *arg) && (on_or_off == '-' || on_or_off == '+'))
641 while (flag_name = *++arg)
643 if (flag_name == '?')
646 return (EXECUTION_SUCCESS);
648 else if (flag_name == 'o') /* -+o option-name */
657 list_minus_o_opts (-1, (on_or_off == '+'));
658 rv = sh_chkwrite (rv);
662 option_name = opt->word->word;
664 if (option_name == 0 || *option_name == '\0' ||
665 *option_name == '-' || *option_name == '+')
667 list_minus_o_opts (-1, (on_or_off == '+'));
670 list = list->next; /* Skip over option name. */
673 if ((r = set_minus_o_option (on_or_off, option_name)) != EXECUTION_SUCCESS)
679 else if (change_flag (flag_name, on_or_off) == FLAG_ERROR)
687 return (EXECUTION_FAILURE);
699 /* Assigning $1 ... $n */
700 if (list || force_assignment)
701 remember_args (list, 1);
702 /* Set up new value of $SHELLOPTS */
709 $FUNCTION unset_builtin
710 $SHORT_DOC unset [-f] [-v] [name ...]
711 For each NAME, remove the corresponding variable or function.
714 -f treat each NAME as a shell function
715 -v treat each NAME as a shell variable
717 Without options, unset first tries to unset a variable, and if that fails,
718 tries to unset a function.
720 Some variables cannot be unset; also see `readonly'.
723 #define NEXT_VARIABLE() any_failed++; list = list->next; continue;
729 int unset_function, unset_variable, unset_array, opt, any_failed;
732 unset_function = unset_variable = unset_array = any_failed = 0;
734 reset_internal_getopt ();
735 while ((opt = internal_getopt (list, "fv")) != -1)
753 if (unset_function && unset_variable)
755 builtin_error (_("cannot simultaneously unset a function and a variable"));
756 return (EXECUTION_FAILURE);
763 #if defined (ARRAY_VARS)
767 name = list->word->word;
769 #if defined (ARRAY_VARS)
771 if (!unset_function && valid_array_reference (name))
773 t = strchr (name, '[');
779 /* Bash allows functions with names which are not valid identifiers
780 to be created when not in posix mode, so check only when in posix
781 mode when unsetting a function. */
782 if (((unset_function && posixly_correct) || !unset_function) && legal_identifier (name) == 0)
788 var = unset_function ? find_function (name) : find_variable (name);
790 if (var && !unset_function && non_unsettable_p (var))
792 builtin_error (_("%s: cannot unset"), name);
796 /* Posix.2 says that unsetting readonly variables is an error. */
797 if (var && readonly_p (var))
799 builtin_error (_("%s: cannot unset: readonly %s"),
800 name, unset_function ? "function" : "variable");
804 /* Unless the -f option is supplied, the name refers to a variable. */
805 #if defined (ARRAY_VARS)
806 if (var && unset_array)
808 if (array_p (var) == 0)
810 builtin_error (_("%s: not an array variable"), name);
815 tem = unbind_array_element (var, t);
821 #endif /* ARRAY_VARS */
822 tem = unset_function ? unbind_func (name) : unbind_variable (name);
824 /* This is what Posix.2 draft 11+ says. ``If neither -f nor -v
825 is specified, the name refers to a variable; if a variable by
826 that name does not exist, a function by that name, if any,
828 if (tem == -1 && !unset_function && !unset_variable)
829 tem = unbind_func (name);
831 /* SUSv3, POSIX.1-2001 say: ``Unsetting a variable or function that
832 was not previously set shall not be considered an error.'' */
834 if (unset_function == 0)
835 stupidly_hack_special_variables (name);
840 return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS);