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, 1989, 1991 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"
40 #include "bashgetopt.h"
42 #if defined (READLINE)
43 # include "../input.h"
44 # include "../bashline.h"
45 # include <readline/readline.h>
49 # include "../bashhist.h"
52 extern int interactive;
53 extern int noclobber, posixly_correct, ignoreeof, eof_encountered_limit;
54 #if defined (READLINE)
55 extern int no_line_editing;
60 $SHORT_DOC set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
61 -a Mark variables which are modified or created for export.
62 -b Notify of job termination immediately.
63 -e Exit immediately if a command exits with a non-zero status.
64 -f Disable file name generation (globbing).
65 -h Remember the location of commands as they are looked up.
66 -i Force the shell to be an "interactive" one. Interactive shells
67 always read `~/.bashrc' on startup.
68 -k All assignment arguments are placed in the environment for a
69 command, not just those that precede the command name.
70 -m Job control is enabled.
71 -n Read commands but do not execute them.
73 Set the variable corresponding to option-name:
75 braceexpand same as -B
76 #if defined (READLINE)
77 emacs use an emacs-style line editing interface
81 #if defined (BANG_HISTORY)
83 #endif /* BANG_HISTORY */
85 history enable command history
87 ignoreeof the shell will not exit upon reading EOF
89 allow comments to appear in interactive commands
99 posix change the behavior of bash where the default
100 operation differs from the 1003.2 standard to
102 privileged same as -p
104 #if defined (READLINE)
105 vi use a vi-style line editing interface
106 #endif /* READLINE */
108 -p Turned on whenever the real and effective user ids do not match.
109 Disables processing of the $ENV file and importing of shell
110 functions. Turning this option off causes the effective uid and
111 gid to be set to the real uid and gid.
112 -t Exit after reading and executing one command.
113 -u Treat unset variables as an error when substituting.
114 -v Print shell input lines as they are read.
115 -x Print commands and their arguments as they are executed.
116 #if defined (BRACE_EXPANSION)
117 -B the shell will perform brace expansion
118 #endif /* BRACE_EXPANSION */
119 -C If set, disallow existing regular files to be overwritten
120 by redirection of output.
121 #if defined (BANG_HISTORY)
122 -H Enable ! style history substitution. This flag is on
124 #endif /* BANG_HISTORY */
125 -P If set, do not follow symbolic links when executing commands
126 such as cd which change the current directory.
128 Using + rather than - causes these flags to be turned off. The
129 flags can also be used upon invocation of the shell. The current
130 set of flags may be found in $-. The remaining n ARGs are positional
131 parameters and are assigned, in order, to $1, $2, .. $n. If no
132 ARGs are given, all shell variables are printed.
135 static int set_ignoreeof ();
136 static int set_posix_mode ();
138 #if defined (READLINE)
139 static int set_edit_mode ();
140 static int get_edit_mode ();
143 #if defined (HISTORY)
144 static int bash_set_history ();
147 static char *on = "on";
148 static char *off = "off";
150 /* An a-list used to match long options for set -o to the corresponding
156 { "allexport", 'a' },
157 #if defined (BRACE_EXPANSION)
158 { "braceexpand",'B' },
162 #if defined (BANG_HISTORY)
163 { "histexpand", 'H' },
164 #endif /* BANG_HISTORY */
167 { "noclobber", 'C' },
170 #if defined (JOB_CONTROL)
172 #endif /* JOB_CONTROL */
176 { "privileged", 'p' },
187 } binary_o_options[] = {
188 #if defined (HISTORY)
189 { "history", &remember_on_history, bash_set_history, (Function *)NULL },
191 { "ignoreeof", &ignoreeof, set_ignoreeof, (Function *)NULL },
192 { "interactive-comments", &interactive_comments, (Function *)NULL, (Function *)NULL },
193 { "posix", &posixly_correct, set_posix_mode, (Function *)NULL },
194 #if defined (READLINE)
195 { "emacs", (int *)NULL, set_edit_mode, get_edit_mode },
196 { "vi", (int *)NULL, set_edit_mode, get_edit_mode },
198 { (char *)NULL, (int *)NULL }
201 #define GET_BINARY_O_OPTION_VALUE(i, name) \
202 ((binary_o_options[i].get_func) ? (*binary_o_options[i].get_func) (name) \
203 : (*binary_o_options[i].variable))
205 #define SET_BINARY_O_OPTION_VALUE(i, onoff, name) \
206 ((binary_o_options[i].set_func) ? (*binary_o_options[i].set_func) (onoff, name) \
207 : (*binary_o_options[i].variable = (onoff == FLAG_ON)))
210 minus_o_option_value (name)
216 for (i = 0; o_options[i].name; i++)
218 if (STREQ (name, o_options[i].name))
220 on_or_off = find_flag (o_options[i].letter);
221 return ((on_or_off == FLAG_UNKNOWN) ? -1 : *on_or_off);
224 for (i = 0; binary_o_options[i].name; i++)
226 if (STREQ (name, binary_o_options[i].name))
227 return (GET_BINARY_O_OPTION_VALUE (i, name));
233 #define MINUS_O_FORMAT "%-15s\t%s\n"
236 print_minus_o_option (name, value, pflag)
241 printf (MINUS_O_FORMAT, name, value ? on : off);
243 printf ("set %co %s\n", value ? '-' : '+', name);
247 list_minus_o_opts (mode, reusable)
251 int *on_or_off, value;
253 for (value = i = 0; o_options[i].name; i++)
255 on_or_off = find_flag (o_options[i].letter);
256 if (on_or_off == FLAG_UNKNOWN)
258 if (mode == -1 || mode == *on_or_off)
259 print_minus_o_option (o_options[i].name, *on_or_off, reusable);
261 for (i = 0; binary_o_options[i].name; i++)
263 value = GET_BINARY_O_OPTION_VALUE (i, binary_o_options[i].name);
264 if (mode == -1 || mode == value)
265 print_minus_o_option (binary_o_options[i].name, value, reusable);
275 n = (sizeof (o_options) / sizeof (o_options[0])) +
276 (sizeof (binary_o_options) / sizeof (binary_o_options[0]));
277 ret = alloc_array (n + 1);
278 for (i = ind = 0; o_options[i].name; i++)
279 ret[ind++] = o_options[i].name;
280 for (i = 0; binary_o_options[i].name; i++)
281 ret[ind++] = binary_o_options[i].name;
282 ret[ind] = (char *)NULL;
287 set_ignoreeof (on_or_off, option_name)
291 ignoreeof = on_or_off == FLAG_ON;
292 unbind_variable ("ignoreeof");
294 bind_variable ("IGNOREEOF", "10");
296 unbind_variable ("IGNOREEOF");
297 sv_ignoreeof ("IGNOREEOF");
302 set_posix_mode (on_or_off, option_name)
306 posixly_correct = on_or_off == FLAG_ON;
307 if (posixly_correct == 0)
308 unbind_variable ("POSIXLY_CORRECT");
310 bind_variable ("POSIXLY_CORRECT", "y");
311 sv_strict_posix ("POSIXLY_CORRECT");
315 #if defined (READLINE)
316 /* Magic. This code `knows' how readline handles rl_editing_mode. */
318 set_edit_mode (on_or_off, option_name)
324 if (on_or_off == FLAG_ON)
326 rl_variable_bind ("editing-mode", option_name);
329 with_input_from_stdin ();
334 isemacs = rl_editing_mode == 1;
335 if ((isemacs && *option_name == 'e') || (!isemacs && *option_name == 'v'))
338 with_input_from_stream (stdin, "stdin");
342 return 1-no_line_editing;
349 return (*name == 'e' ? no_line_editing == 0 && rl_editing_mode == 1
350 : no_line_editing == 0 && rl_editing_mode == 0);
352 #endif /* READLINE */
354 #if defined (HISTORY)
356 bash_set_history (on_or_off, option_name)
360 if (on_or_off == FLAG_ON)
362 bash_history_enable ();
363 if (history_lines_this_session == 0)
367 bash_history_disable ();
368 return (1 - remember_on_history);
373 set_minus_o_option (on_or_off, option_name)
381 for (i = 0; binary_o_options[i].name; i++)
383 if (STREQ (option_name, binary_o_options[i].name))
385 SET_BINARY_O_OPTION_VALUE (i, on_or_off, option_name);
386 return (EXECUTION_SUCCESS);
390 for (i = 0, option_char = -1, set_func = 0; o_options[i].name; i++)
392 if (STREQ (option_name, o_options[i].name))
394 option_char = o_options[i].letter;
398 if (option_char == -1)
400 builtin_error ("%s: unknown option name", option_name);
401 return (EXECUTION_FAILURE);
403 if (change_flag (option_char, on_or_off) == FLAG_ERROR)
405 bad_option (option_name);
406 return (EXECUTION_FAILURE);
408 return (EXECUTION_SUCCESS);
412 print_all_shell_variables ()
416 vars = all_shell_variables ();
419 print_var_list (vars);
423 /* POSIX.2 does not allow function names and definitions to be output when
424 `set' is invoked without options (PASC Interp #202). */
425 if (posixly_correct == 0)
427 vars = all_shell_functions ();
430 print_func_list (vars);
440 int vsize, i, vptr, *ip, exported;
443 for (vsize = i = 0; o_options[i].name; i++)
445 ip = find_flag (o_options[i].letter);
447 vsize += strlen (o_options[i].name) + 1;
449 for (i = 0; binary_o_options[i].name; i++)
450 if (GET_BINARY_O_OPTION_VALUE (i, binary_o_options[i].name))
451 vsize += strlen (binary_o_options[i].name) + 1;
453 value = xmalloc (vsize + 1);
455 for (i = vptr = 0; o_options[i].name; i++)
457 ip = find_flag (o_options[i].letter);
460 strcpy (value + vptr, o_options[i].name);
461 vptr += strlen (o_options[i].name);
465 for (i = 0; binary_o_options[i].name; i++)
466 if (GET_BINARY_O_OPTION_VALUE (i, binary_o_options[i].name))
468 strcpy (value + vptr, binary_o_options[i].name);
469 vptr += strlen (binary_o_options[i].name);
473 vptr--; /* cut off trailing colon */
476 v = find_variable ("SHELLOPTS");
478 /* Turn off the read-only attribute so we can bind the new value, and
479 note whether or not the variable was exported. */
482 VUNSETATTR (v, att_readonly);
483 exported = exported_p (v);
488 v = bind_variable ("SHELLOPTS", value);
490 /* Turn the read-only attribute back on, and turn off the export attribute
491 if it was set implicitly by mark_modified_vars and SHELLOPTS was not
492 exported before we bound the new value. */
493 VSETATTR (v, att_readonly);
494 if (mark_modified_vars && exported == 0 && exported_p (v))
495 VUNSETATTR (v, att_exported);
501 parse_shellopts (value)
508 while (vname = extract_colon_unit (value, &vptr))
510 set_minus_o_option (FLAG_ON, vname);
516 initialize_shell_options (no_shellopts)
522 if (no_shellopts == 0)
524 var = find_variable ("SHELLOPTS");
525 /* set up any shell options we may have inherited. */
526 if (var && imported_p (var))
528 temp = (array_p (var)) ? (char *)NULL : savestring (value_cell (var));
531 parse_shellopts (temp);
537 /* Set up the $SHELLOPTS variable. */
541 /* Reset the values of the -o options that are not also shell flags. This is
542 called from execute_cmd.c:initialize_subshell() when setting up a subshell
543 to run an executable shell script without a leading `#!'. */
545 reset_shell_options ()
547 #if defined (HISTORY)
548 remember_on_history = 1;
553 /* Set some flags from the word values in the input list. If LIST is empty,
554 then print out the values of the variables instead. If LIST contains
555 non-flags, then set $1 - $9 to the successive words of LIST. */
560 int on_or_off, flag_name, force_assignment, opts_changed;
566 print_all_shell_variables ();
567 return (EXECUTION_SUCCESS);
570 /* Check validity of flag arguments. */
571 if (*list->word->word == '-' || *list->word->word == '+')
573 for (l = list; l && (arg = l->word->word); l = l->next)
577 if (arg[0] != '-' && arg[0] != '+')
580 /* `-' or `--' signifies end of flag arguments. */
581 if (arg[0] == '-' && (!arg[1] || (arg[1] == '-' && !arg[2])))
586 if (find_flag (c) == FLAG_UNKNOWN && c != 'o')
589 s[0] = c; s[1] = '\0';
593 return (c == '?' ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
599 /* Do the set command. While the list consists of words starting with
600 '-' or '+' treat them as flags, otherwise, start assigning them to
602 for (force_assignment = opts_changed = 0; list; )
604 arg = list->word->word;
606 /* If the argument is `--' or `-' then signal the end of the list
607 and remember the remaining arguments. */
608 if (arg[0] == '-' && (!arg[1] || (arg[1] == '-' && !arg[2])))
612 /* `set --' unsets the positional parameters. */
614 force_assignment = 1;
616 /* Until told differently, the old shell behaviour of
617 `set - [arg ...]' being equivalent to `set +xv [arg ...]'
618 stands. Posix.2 says the behaviour is marked as obsolescent. */
621 change_flag ('x', '+');
622 change_flag ('v', '+');
629 if ((on_or_off = *arg) && (on_or_off == '-' || on_or_off == '+'))
631 while (flag_name = *++arg)
633 if (flag_name == '?')
636 return (EXECUTION_SUCCESS);
638 else if (flag_name == 'o') /* -+o option-name */
647 list_minus_o_opts (-1, (on_or_off == '+'));
651 option_name = opt->word->word;
653 if (option_name == 0 || *option_name == '\0' ||
654 *option_name == '-' || *option_name == '+')
656 list_minus_o_opts (-1, (on_or_off == '+'));
659 list = list->next; /* Skip over option name. */
662 if (set_minus_o_option (on_or_off, option_name) != EXECUTION_SUCCESS)
665 return (EXECUTION_FAILURE);
668 else if (change_flag (flag_name, on_or_off) == FLAG_ERROR)
677 return (EXECUTION_FAILURE);
689 /* Assigning $1 ... $n */
690 if (list || force_assignment)
691 remember_args (list, 1);
692 /* Set up new value of $SHELLOPTS */
695 return (EXECUTION_SUCCESS);
699 $FUNCTION unset_builtin
700 $SHORT_DOC unset [-f] [-v] [name ...]
701 For each NAME, remove the corresponding variable or function. Given
702 the `-v', unset will only act on variables. Given the `-f' flag,
703 unset will only act on functions. With neither flag, unset first
704 tries to unset a variable, and if that fails, then tries to unset a
705 function. Some variables cannot be unset; also see readonly.
708 #define NEXT_VARIABLE() any_failed++; list = list->next; continue;
714 int unset_function, unset_variable, unset_array, opt, any_failed;
717 unset_function = unset_variable = unset_array = any_failed = 0;
719 reset_internal_getopt ();
720 while ((opt = internal_getopt (list, "fv")) != -1)
738 if (unset_function && unset_variable)
740 builtin_error ("cannot simultaneously unset a function and a variable");
741 return (EXECUTION_FAILURE);
748 #if defined (ARRAY_VARS)
752 name = list->word->word;
754 #if defined (ARRAY_VARS)
755 if (!unset_function && valid_array_reference (name))
757 t = strchr (name, '[');
763 /* Bash allows functions with names which are not valid identifiers
764 to be created when not in posix mode, so check only when in posix
765 mode when unsetting a function. */
766 if (((unset_function && posixly_correct) || !unset_function) && legal_identifier (name) == 0)
768 builtin_error ("`%s': not a valid identifier", name);
772 var = unset_function ? find_function (name) : find_variable (name);
774 if (var && !unset_function && non_unsettable_p (var))
776 builtin_error ("%s: cannot unset", name);
780 /* Posix.2 says that unsetting readonly variables is an error. */
781 if (var && readonly_p (var))
783 builtin_error ("%s: cannot unset: readonly %s",
784 name, unset_function ? "function" : "variable");
788 /* Unless the -f option is supplied, the name refers to a variable. */
789 #if defined (ARRAY_VARS)
790 if (var && unset_array)
792 if (array_p (var) == 0)
794 builtin_error ("%s: not an array variable", name);
798 tem = unbind_array_element (var, t);
801 #endif /* ARRAY_VARS */
802 tem = makunbound (name, unset_function ? shell_functions : shell_variables);
804 /* This is what Posix.2 draft 11+ says. ``If neither -f nor -v
805 is specified, the name refers to a variable; if a variable by
806 that name does not exist, a function by that name, if any,
808 if (tem == -1 && !unset_function && !unset_variable)
809 tem = makunbound (name, shell_functions);
813 else if (!unset_function)
814 stupidly_hack_special_variables (name);
819 return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS);