1 This file is setattr.def, from which is created setattr.c.
2 It implements the builtins "export" and "readonly", 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>
34 #include "../bashansi.h"
38 #include "bashgetopt.h"
40 extern int posixly_correct;
41 extern int array_needs_making;
42 extern char *this_command_name;
43 extern Function *this_shell_builtin;
46 extern int declare_builtin ();
49 #define READONLY_OR_EXPORT \
50 (this_shell_builtin == readonly_builtin || this_shell_builtin == export_builtin)
53 $FUNCTION export_builtin
54 $SHORT_DOC export [-nf] [name ...] or export -p
55 NAMEs are marked for automatic export to the environment of
56 subsequently executed commands. If the -f option is given,
57 the NAMEs refer to functions. If no NAMEs are given, or if `-p'
58 is given, a list of all names that are exported in this shell is
59 printed. An argument of `-n' says to remove the export property
60 from subsequent NAMEs. An argument of `--' disables further option
64 /* For each variable name in LIST, make that variable appear in the
65 environment passed to simple commands. If there is no LIST, then
66 print all such variables. An argument of `-n' says to remove the
67 exported attribute from variables named in LIST. An argument of
68 -f indicates that the names present in LIST refer to functions. */
71 register WORD_LIST *list;
73 return (set_or_show_attributes (list, att_exported, 0));
77 $FUNCTION readonly_builtin
78 $SHORT_DOC readonly [-anf] [name ...] or readonly -p
79 The given NAMEs are marked readonly and the values of these NAMEs may
80 not be changed by subsequent assignment. If the -f option is given,
81 then functions corresponding to the NAMEs are so marked. If no
82 arguments are given, or if `-p' is given, a list of all readonly names
83 is printed. An argument of `-n' says to remove the readonly property
84 from subsequent NAMEs. The `-a' option means to treat each NAME as
85 an array variable. An argument of `--' disables further option
89 /* For each variable name in LIST, make that variable readonly. Given an
90 empty LIST, print out all existing readonly variables. */
92 readonly_builtin (list)
93 register WORD_LIST *list;
95 return (set_or_show_attributes (list, att_readonly, 0));
98 /* For each variable name in LIST, make that variable have the specified
99 ATTRIBUTE. An arg of `-n' says to remove the attribute from the the
100 remaining names in LIST. */
102 set_or_show_attributes (list, attribute, nodefs)
103 register WORD_LIST *list;
104 int attribute, nodefs;
106 register SHELL_VAR *var;
107 int assign, undo, functions_only, arrays_only, any_failed, assign_error, opt;
109 #if defined (ARRAY_VARS)
110 WORD_LIST *nlist, *tlist;
114 undo = functions_only = arrays_only = any_failed = assign_error = 0;
115 /* Read arguments from the front of the list. */
116 reset_internal_getopt ();
117 while ((opt = internal_getopt (list, "anfp")) != -1)
127 #if defined (ARRAY_VARS)
143 if (attribute & att_exported)
144 array_needs_making = 1;
146 /* Cannot undo readonly status, silently disallowed. */
147 if (undo && (attribute & att_readonly))
148 attribute &= ~att_readonly;
152 name = list->word->word;
154 if (functions_only) /* xxx -f name */
156 var = find_function (name);
159 builtin_error ("%s: not a function", name);
163 SETVARATTR (var, attribute, undo);
169 /* xxx [-np] name[=value] */
170 assign = assignment (name);
175 if (legal_identifier (name) == 0)
177 builtin_error ("`%s': not a valid identifier", name);
186 if (assign) /* xxx [-np] name=value */
189 #if defined (ARRAY_VARS)
190 /* Let's try something here. Turn readonly -a xxx=yyy into
191 declare -ra xxx=yyy and see what that gets us. */
195 list->next = (WORD_LIST *)NULL;
196 w = make_word ("-ra");
197 nlist = make_word_list (w, list);
198 opt = declare_builtin (nlist);
199 if (opt != EXECUTION_SUCCESS)
207 /* This word has already been expanded once with command
208 and parameter expansion. Call do_assignment_no_expand (),
209 which does not do command or parameter substitution. If
210 the assignment is not performed correctly, flag an error. */
211 if (do_assignment_no_expand (name) == 0)
216 set_var_attribute (name, attribute, undo);
222 SHELL_VAR **variable_list;
225 if ((attribute & att_function) || functions_only)
227 variable_list = all_shell_functions ();
228 if (attribute != att_function)
229 attribute &= ~att_function; /* so declare -xf works, for example */
232 variable_list = all_shell_variables ();
234 #if defined (ARRAY_VARS)
235 if (attribute & att_array)
238 if (attribute != att_array)
239 attribute &= ~att_array;
245 for (i = 0; var = variable_list[i]; i++)
247 #if defined (ARRAY_VARS)
248 if (arrays_only && array_p (var) == 0)
251 if ((var->attributes & attribute) && invisible_p (var) == 0)
252 show_var_attributes (var, READONLY_OR_EXPORT, nodefs);
254 free (variable_list);
258 return (assign_error ? EX_BADASSIGN
259 : ((any_failed == 0) ? EXECUTION_SUCCESS
260 : EXECUTION_FAILURE));
263 /* Show the attributes for shell variable VAR. If NODEFS is non-zero,
264 don't show function definitions along with the name. If PATTR is
265 non-zero, it indicates we're being called from `export' or `readonly'.
266 In POSIX mode, this prints the name of the calling builtin (`export'
267 or `readonly') instead of `declare', and doesn't print function defs
268 when called by `export' or `readonly'. */
270 show_var_attributes (var, pattr, nodefs)
279 /* pattr == 0 means we are called from `declare'. */
280 if (pattr == 0 || posixly_correct == 0)
282 #if defined (ARRAY_VARS)
287 if (function_p (var))
293 if (readonly_p (var))
296 if (exported_p (var))
301 #if defined (ARRAY_VARS)
306 if (function_p (var))
312 if (pattr == 0 || posixly_correct == 0)
313 printf ("declare -%s ", i ? flags : "-");
315 printf ("%s -%s ", this_command_name, flags);
317 printf ("%s ", this_command_name);
319 #if defined (ARRAY_VARS)
321 print_array_assignment (var, 1);
324 /* force `readline' and `export' to not print out function definitions
325 when in POSIX mode. */
326 if (nodefs || (function_p (var) && pattr != 0 && posixly_correct))
327 printf ("%s\n", var->name);
328 else if (function_p (var))
329 printf ("%s\n", named_function_string (var->name, function_cell (var), 1));
332 x = sh_double_quote (value_cell (var) ? value_cell (var) : "");
333 printf ("%s=%s\n", var->name, x);
340 show_name_attributes (name, nodefs)
347 var = find_tempenv_variable (name);
349 var = find_variable (name);
351 if (var && invisible_p (var) == 0)
353 show_var_attributes (var, READONLY_OR_EXPORT, nodefs);
355 dispose_variable (var);
363 set_var_attribute (name, attribute, undo)
370 var = find_variable (name);
373 if (tv = find_tempenv_variable (name))
375 var = bind_variable (tv->name, tv->value ? tv->value : "");
376 dispose_variable (tv);
379 var = find_variable (name);
383 var = bind_variable (name, (char *)NULL);
384 VSETATTR (var, att_invisible);
389 SETVARATTR (var, attribute, undo);
391 if (var && (exported_p (var) || (attribute & att_exported)))
392 array_needs_making++; /* XXX */