1 /* shell.c -- GNU's idea of the POSIX shell specification. */
3 /* Copyright (C) 1987-2019 Free Software Foundation, Inc.
5 This file is part of GNU Bash, the Bourne Again SHell.
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
23 Sunday, January 10th, 1988.
24 Initial author: Brian Fox
26 #define INSTALL_DEBUG_MODE
30 #include "bashtypes.h"
31 #if !defined (_MINIX) && defined (HAVE_SYS_FILE_H)
32 # include <sys/file.h>
34 #include "posixstat.h"
35 #include "posixtime.h"
41 #if defined (HAVE_PWD_H)
45 #if defined (HAVE_UNISTD_H)
51 #define NEED_SH_SETLINEBUF_DECL /* used in externs.h */
57 #include "mailcheck.h"
59 #include "builtins/common.h"
61 #if defined (JOB_CONTROL)
64 extern int running_in_background
;
65 extern int initialize_job_control
PARAMS((int));
66 extern int get_tty_state
PARAMS((void));
67 #endif /* JOB_CONTROL */
70 #include "execute_cmd.h"
73 #if defined (USING_BASH_MALLOC) && defined (DEBUG) && !defined (DISABLE_MALLOC_WRAPPERS)
74 # include <malloc/shmalloc.h>
78 # include "bashhist.h"
79 # include <readline/history.h>
82 #if defined (READLINE)
83 # include <readline/readline.h>
84 # include "bashline.h"
87 #include <tilde/tilde.h>
88 #include <glob/strmatch.h>
90 #if defined (__OPENNT)
91 # include <opennt/opennt.h>
94 #if !defined (HAVE_GETPW_DECLS)
95 extern struct passwd
*getpwuid ();
96 #endif /* !HAVE_GETPW_DECLS */
102 #if defined (NO_MAIN_ENV_ARG)
103 extern char **environ
; /* used if no third argument to main() */
106 extern int gnu_error_format
;
108 /* Non-zero means that this shell has already been run; i.e. you should
109 call shell_reinitialize () if you need to start afresh. */
110 int shell_initialized
= 0;
111 int bash_argv_initialized
= 0;
113 COMMAND
*global_command
= (COMMAND
*)NULL
;
115 /* Information about the current user. */
116 struct user_info current_user
=
118 (uid_t
)-1, (uid_t
)-1, (gid_t
)-1, (gid_t
)-1,
119 (char *)NULL
, (char *)NULL
, (char *)NULL
122 /* The current host's name. */
123 char *current_host_name
= (char *)NULL
;
125 /* Non-zero means that this shell is a login shell.
128 1 = login shell from getty (or equivalent fake out)
129 -1 = login shell from "--login" (or -l) flag.
130 -2 = both from getty, and from flag.
134 /* Non-zero means that at this moment, the shell is interactive. In
135 general, this means that the shell is at this moment reading input
136 from the keyboard. */
139 /* Non-zero means that the shell was started as an interactive shell. */
140 int interactive_shell
= 0;
142 /* Non-zero means to send a SIGHUP to all jobs when an interactive login
146 /* Non-zero means to list status of running and stopped jobs at shell exit */
147 int check_jobs_at_exit
= 0;
149 /* Non-zero means to change to a directory name supplied as a command name */
152 /* Tells what state the shell was in when it started:
153 0 = non-interactive shell script
156 3 = wordexp evaluation
157 This is a superset of the information provided by interactive_shell.
159 int startup_state
= 0;
160 int reading_shell_script
= 0;
162 /* Special debugging helper. */
163 int debugging_login_shell
= 0;
165 /* The environment that the shell passes to other commands. */
166 char **shell_environment
;
168 /* Non-zero when we are executing a top-level command. */
171 /* The number of commands executed so far. */
172 int current_command_number
= 1;
174 /* Non-zero is the recursion depth for commands. */
175 int indirection_level
= 0;
177 /* The name of this shell, as taken from argv[0]. */
178 char *shell_name
= (char *)NULL
;
180 /* time in seconds when the shell was started */
181 time_t shell_start_time
;
182 struct timeval shellstart
;
184 /* Are we running in an emacs shell window? */
185 int running_under_emacs
;
187 /* Do we have /dev/fd? */
189 int have_devfd
= HAVE_DEV_FD
;
194 /* The name of the .(shell)rc file. */
195 static char *bashrc_file
= DEFAULT_BASHRC
;
197 /* Non-zero means to act more like the Bourne shell on startup. */
198 static int act_like_sh
;
200 /* Non-zero if this shell is being run by `su'. */
203 /* Non-zero if we have already expanded and sourced $ENV. */
204 static int sourced_env
;
206 /* Is this shell running setuid? */
207 static int running_setuid
;
209 /* Values for the long-winded argument names. */
210 static int debugging
; /* Do debugging things. */
211 static int no_rc
; /* Don't execute ~/.bashrc */
212 static int no_profile
; /* Don't execute .profile */
213 static int do_version
; /* Display interesting version info. */
214 static int make_login_shell
; /* Make this shell be a `-bash' shell. */
215 static int want_initial_help
; /* --help option */
217 int debugging_mode
= 0; /* In debugging mode with --debugger */
218 #if defined (READLINE)
219 int no_line_editing
= 0; /* non-zero -> don't do fancy line editing. */
221 int no_line_editing
= 1; /* can't have line editing without readline */
223 int dump_translatable_strings
; /* Dump strings in $"...", don't execute. */
224 int dump_po_strings
; /* Dump strings in $"..." in po format */
225 int wordexp_only
= 0; /* Do word expansion only */
226 int protected_mode
= 0; /* No command substitution with --wordexp */
228 int pretty_print_mode
= 0; /* pretty-print a shell script */
230 #if defined (STRICT_POSIX)
231 int posixly_correct
= 1; /* Non-zero means posix.2 superset. */
233 int posixly_correct
= 0; /* Non-zero means posix.2 superset. */
236 /* Some long-winded argument names. These are obviously new. */
239 static const struct {
245 { "debug", Int
, &debugging
, (char **)0x0 },
246 #if defined (DEBUGGER)
247 { "debugger", Int
, &debugging_mode
, (char **)0x0 },
249 { "dump-po-strings", Int
, &dump_po_strings
, (char **)0x0 },
250 { "dump-strings", Int
, &dump_translatable_strings
, (char **)0x0 },
251 { "help", Int
, &want_initial_help
, (char **)0x0 },
252 { "init-file", Charp
, (int *)0x0, &bashrc_file
},
253 { "login", Int
, &make_login_shell
, (char **)0x0 },
254 { "noediting", Int
, &no_line_editing
, (char **)0x0 },
255 { "noprofile", Int
, &no_profile
, (char **)0x0 },
256 { "norc", Int
, &no_rc
, (char **)0x0 },
257 { "posix", Int
, &posixly_correct
, (char **)0x0 },
258 { "pretty-print", Int
, &pretty_print_mode
, (char **)0x0 },
259 #if defined (WORDEXP_OPTION)
260 { "protected", Int
, &protected_mode
, (char **)0x0 },
262 { "rcfile", Charp
, (int *)0x0, &bashrc_file
},
263 #if defined (RESTRICTED_SHELL)
264 { "restricted", Int
, &restricted
, (char **)0x0 },
266 { "verbose", Int
, &verbose_flag
, (char **)0x0 },
267 { "version", Int
, &do_version
, (char **)0x0 },
268 #if defined (WORDEXP_OPTION)
269 { "wordexp", Int
, &wordexp_only
, (char **)0x0 },
271 { (char *)0x0, Int
, (int *)0x0, (char **)0x0 }
274 /* These are extern so execute_simple_command can set them, and then
275 longjmp back to main to execute a shell script, instead of calling
276 main () again and resulting in indefinite, possibly fatal, stack
278 procenv_t subshell_top_level
;
280 char **subshell_argv
;
281 char **subshell_envp
;
285 #if defined (BUFFERED_INPUT)
286 /* The file descriptor from which the shell is reading input. */
287 int default_buffered_input
= -1;
290 /* The following two variables are not static so they can show up in $-. */
291 int read_from_stdin
; /* -s flag supplied */
292 int want_pending_command
; /* -c flag supplied */
294 /* This variable is not static so it can be bound to $BASH_EXECUTION_STRING */
295 char *command_execution_string
; /* argument to -c option */
296 char *shell_script_filename
; /* shell script */
298 int malloc_trace_at_exit
= 0;
300 static int shell_reinitialized
= 0;
302 static FILE *default_input
;
304 static STRING_INT_ALIST
*shopt_alist
;
305 static int shopt_ind
= 0, shopt_len
= 0;
307 static int parse_long_options
PARAMS((char **, int, int));
308 static int parse_shell_options
PARAMS((char **, int, int));
309 static int bind_args
PARAMS((char **, int, int, int));
311 static void start_debugger
PARAMS((void));
313 static void add_shopt_to_alist
PARAMS((char *, int));
314 static void run_shopt_alist
PARAMS((void));
316 static void execute_env_file
PARAMS((char *));
317 static void run_startup_files
PARAMS((void));
318 static int open_shell_script
PARAMS((char *));
319 static void set_bash_input
PARAMS((void));
320 static int run_one_command
PARAMS((char *));
321 #if defined (WORDEXP_OPTION)
322 static int run_wordexp
PARAMS((char *));
325 static int uidget
PARAMS((void));
327 static void set_option_defaults
PARAMS((void));
328 static void reset_option_defaults
PARAMS((void));
330 static void init_interactive
PARAMS((void));
331 static void init_noninteractive
PARAMS((void));
332 static void init_interactive_script
PARAMS((void));
334 static void set_shell_name
PARAMS((char *));
335 static void shell_initialize
PARAMS((void));
336 static void shell_reinitialize
PARAMS((void));
338 static void show_shell_usage
PARAMS((FILE *, int));
342 _cygwin32_check_tmp ()
346 if (stat ("/tmp", &sb
) < 0)
347 internal_warning (_("could not find /tmp, please create!"));
350 if (S_ISDIR (sb
.st_mode
) == 0)
351 internal_warning (_("/tmp must be a valid directory name"));
354 #endif /* __CYGWIN__ */
356 #if defined (NO_MAIN_ENV_ARG)
357 /* systems without third argument to main() */
362 #else /* !NO_MAIN_ENV_ARG */
364 main (argc
, argv
, env
)
367 #endif /* !NO_MAIN_ENV_ARG */
370 int code
, old_errexit_flag
;
371 #if defined (RESTRICTED_SHELL)
374 volatile int locally_skip_execution
;
375 volatile int arg_index
, top_level_arg_index
;
380 #endif /* __OPENNT */
386 USE_VAR(old_errexit_flag
);
387 #if defined (RESTRICTED_SHELL)
391 /* Catch early SIGINTs. */
392 code
= setjmp_nosigs (top_level
);
398 #if defined (USING_BASH_MALLOC) && defined (DEBUG) && !defined (DISABLE_MALLOC_WRAPPERS)
399 malloc_set_register (1); /* XXX - change to 1 for malloc debugging */
405 _cygwin32_check_tmp ();
406 #endif /* __CYGWIN__ */
408 /* Wait forever if we are debugging a login shell. */
409 while (debugging_login_shell
) sleep (3);
411 set_default_locale ();
413 running_setuid
= uidget ();
415 if (getenv ("POSIXLY_CORRECT") || getenv ("POSIX_PEDANTIC"))
418 #if defined (USE_GNU_MALLOC_LIBRARY)
419 mcheck (programming_error
, (void (*) ())0);
420 #endif /* USE_GNU_MALLOC_LIBRARY */
422 if (setjmp_sigs (subshell_top_level
))
424 argc
= subshell_argc
;
425 argv
= subshell_argv
;
430 shell_reinitialized
= 0;
432 /* Initialize `local' variables for all `invocations' of main (). */
434 if (arg_index
> argc
)
436 command_execution_string
= shell_script_filename
= (char *)NULL
;
437 want_pending_command
= locally_skip_execution
= read_from_stdin
= 0;
438 default_input
= stdin
;
439 #if defined (BUFFERED_INPUT)
440 default_buffered_input
= -1;
443 /* Fix for the `infinite process creation' bug when running shell scripts
444 from startup files on System V. */
445 login_shell
= make_login_shell
= 0;
447 /* If this shell has already been run, then reinitialize it to a
449 if (shell_initialized
|| shell_name
)
451 /* Make sure that we do not infinitely recurse as a login shell. */
452 if (*shell_name
== '-')
455 shell_reinitialize ();
456 if (setjmp_nosigs (top_level
))
460 shell_environment
= env
;
461 set_shell_name (argv
[0]);
463 gettimeofday (&shellstart
, 0);
464 shell_start_time
= shellstart
.tv_sec
;
466 /* Parse argument flags from the input line. */
468 /* Find full word arguments first. */
469 arg_index
= parse_long_options (argv
, arg_index
, argc
);
471 if (want_initial_help
)
473 show_shell_usage (stdout
, 1);
474 exit (EXECUTION_SUCCESS
);
479 show_shell_version (1);
480 exit (EXECUTION_SUCCESS
);
483 echo_input_at_read
= verbose_flag
; /* --verbose given */
485 /* All done with full word options; do standard shell option parsing.*/
486 this_command_name
= shell_name
; /* for error reporting */
487 arg_index
= parse_shell_options (argv
, arg_index
, argc
);
489 /* If user supplied the "--login" (or -l) flag, then set and invert
491 if (make_login_shell
)
494 login_shell
= -login_shell
;
497 set_login_shell ("login_shell", login_shell
!= 0);
500 dump_translatable_strings
= 1;
502 if (dump_translatable_strings
)
503 read_but_dont_execute
= 1;
505 if (running_setuid
&& privileged_mode
== 0)
506 disable_priv_mode ();
508 /* Need to get the argument to a -c option processed in the
509 above loop. The next arg is a command to execute, and the
510 following args are $0...$n respectively. */
511 if (want_pending_command
)
513 command_execution_string
= argv
[arg_index
];
514 if (command_execution_string
== 0)
516 report_error (_("%s: option requires an argument"), "-c");
521 this_command_name
= (char *)NULL
;
523 /* First, let the outside world know about our interactive status.
524 A shell is interactive if the `-i' flag was given, or if all of
525 the following conditions are met:
527 no arguments remaining or the -s flag given
528 standard input is a terminal
529 standard error is a terminal
530 Refer to Posix.2, the description of the `sh' utility. */
532 if (forced_interactive
|| /* -i flag */
533 (!command_execution_string
&& /* No -c command and ... */
534 wordexp_only
== 0 && /* No --wordexp and ... */
535 ((arg_index
== argc
) || /* no remaining args or... */
536 read_from_stdin
) && /* -s flag with args, and */
537 isatty (fileno (stdin
)) && /* Input is a terminal and */
538 isatty (fileno (stderr
)))) /* error output is a terminal. */
541 init_noninteractive ();
544 * Some systems have the bad habit of starting login shells with lots of open
545 * file descriptors. For instance, most systems that have picked up the
546 * pre-4.0 Sun YP code leave a file descriptor open each time you call one
547 * of the getpw* functions, and it's set to be open across execs. That
548 * means one for login, one for xterm, one for shelltool, etc. There are
549 * also systems that open persistent FDs to other agents or files as part
550 * of process startup; these need to be set to be close-on-exec.
552 if (login_shell
&& interactive_shell
)
554 for (i
= 3; i
< 20; i
++)
555 SET_CLOSE_ON_EXEC (i
);
558 /* If we're in a strict Posix.2 mode, turn on interactive comments,
559 alias expansion in non-interactive shells, and other Posix.2 things. */
562 bind_variable ("POSIXLY_CORRECT", "y", 0);
563 sv_strict_posix ("POSIXLY_CORRECT");
566 /* Now we run the shopt_alist and process the options. */
570 /* From here on in, the shell must be a normal functioning shell.
571 Variables from the environment are expected to be set, etc. */
575 set_default_locale_vars ();
578 * M-x term -> TERM=eterm-color INSIDE_EMACS='251,term:0.96' (eterm)
579 * M-x shell -> TERM='dumb' INSIDE_EMACS='25.1,comint' (no line editing)
581 * Older versions of Emacs may set EMACS to 't' or to something like
582 * '22.1 (term:0.96)' instead of (or in addition to) setting INSIDE_EMACS.
583 * They may set TERM to 'eterm' instead of 'eterm-color'. They may have
584 * a now-obsolete command that sets neither EMACS nor INSIDE_EMACS:
585 * M-x terminal -> TERM='emacs-em7955' (line editing)
587 if (interactive_shell
)
589 char *term
, *emacs
, *inside_emacs
;
590 int emacs_term
, in_emacs
;
592 term
= get_string_value ("TERM");
593 emacs
= get_string_value ("EMACS");
594 inside_emacs
= get_string_value ("INSIDE_EMACS");
598 emacs_term
= strstr (inside_emacs
, ",term:") != 0;
603 /* Infer whether we are in an older Emacs. */
604 emacs_term
= strstr (emacs
, " (term:") != 0;
605 in_emacs
= emacs_term
|| STREQ (emacs
, "t");
608 in_emacs
= emacs_term
= 0;
610 /* Not sure any emacs terminal emulator sets TERM=emacs any more */
611 no_line_editing
|= STREQ (term
, "emacs");
612 no_line_editing
|= in_emacs
&& STREQ (term
, "dumb");
614 /* running_under_emacs == 2 for `eterm' */
615 running_under_emacs
= in_emacs
|| STREQN (term
, "emacs", 5);
616 running_under_emacs
+= emacs_term
&& STREQN (term
, "eterm", 5);
618 if (running_under_emacs
)
619 gnu_error_format
= 1;
622 top_level_arg_index
= arg_index
;
623 old_errexit_flag
= exit_immediately_on_error
;
625 /* Give this shell a place to longjmp to before executing the
626 startup files. This allows users to press C-c to abort the
628 code
= setjmp_sigs (top_level
);
631 if (code
== EXITPROG
|| code
== ERREXIT
)
632 exit_shell (last_command_exit_value
);
635 #if defined (JOB_CONTROL)
636 /* Reset job control, since run_startup_files turned it off. */
637 set_job_control (interactive_shell
);
639 /* Reset value of `set -e', since it's turned off before running
640 the startup files. */
641 exit_immediately_on_error
+= old_errexit_flag
;
642 locally_skip_execution
++;
646 arg_index
= top_level_arg_index
;
648 /* Execute the start-up scripts. */
650 if (interactive_shell
== 0)
652 unbind_variable ("PS1");
653 unbind_variable ("PS2");
656 /* This has already been done by init_noninteractive */
657 expand_aliases
= posixly_correct
;
662 change_flag ('i', FLAG_ON
);
666 #if defined (RESTRICTED_SHELL)
667 /* Set restricted_shell based on whether the basename of $0 indicates that
668 the shell should be restricted or if the `-r' option was supplied at
670 restricted_shell
= shell_is_restricted (shell_name
);
672 /* If the `-r' option is supplied at invocation, make sure that the shell
673 is not in restricted mode when running the startup files. */
674 saverst
= restricted
;
678 /* Set positional parameters before running startup files. top_level_arg_index
679 holds the index of the current argument before setting the positional
680 parameters, so any changes performed in the startup files won't affect
681 later option processing. */
684 else if (command_execution_string
)
685 arg_index
= bind_args (argv
, arg_index
, argc
, 0); /* $0 ... $n */
686 else if (arg_index
!= argc
&& read_from_stdin
== 0)
688 shell_script_filename
= argv
[arg_index
++];
689 arg_index
= bind_args (argv
, arg_index
, argc
, 1); /* $1 ... $n */
692 arg_index
= bind_args (argv
, arg_index
, argc
, 1); /* $1 ... $n */
694 /* The startup files are run with `set -e' temporarily disabled. */
695 if (locally_skip_execution
== 0 && running_setuid
== 0)
697 old_errexit_flag
= exit_immediately_on_error
;
698 exit_immediately_on_error
= 0;
700 run_startup_files ();
701 exit_immediately_on_error
+= old_errexit_flag
;
704 /* If we are invoked as `sh', turn on Posix mode. */
707 bind_variable ("POSIXLY_CORRECT", "y", 0);
708 sv_strict_posix ("POSIXLY_CORRECT");
711 #if defined (RESTRICTED_SHELL)
712 /* Turn on the restrictions after executing the startup files. This
713 means that `bash -r' or `set -r' invoked from a startup file will
714 turn on the restrictions after the startup files are executed. */
715 restricted
= saverst
|| restricted
;
716 if (shell_reinitialized
== 0)
717 maybe_make_restricted (shell_name
);
718 #endif /* RESTRICTED_SHELL */
720 #if defined (WORDEXP_OPTION)
724 last_command_exit_value
= run_wordexp (argv
[top_level_arg_index
]);
725 exit_shell (last_command_exit_value
);
729 cmd_init (); /* initialize the command object caches */
732 if (command_execution_string
)
739 #if defined (ONESHOT)
741 run_one_command (command_execution_string
);
742 exit_shell (last_command_exit_value
);
744 with_input_from_string (command_execution_string
, "-c");
745 goto read_and_execute
;
746 #endif /* !ONESHOT */
749 /* Get possible input filename and set up default_buffered_input or
750 default_input as appropriate. */
751 if (shell_script_filename
)
752 open_shell_script (shell_script_filename
);
753 else if (interactive
== 0)
755 /* In this mode, bash is reading a script from stdin, which is a
756 pipe or redirected file. */
757 #if defined (BUFFERED_INPUT)
758 default_buffered_input
= fileno (stdin
); /* == 0 */
760 setbuf (default_input
, (char *)NULL
);
761 #endif /* !BUFFERED_INPUT */
764 else if (top_level_arg_index
== argc
) /* arg index before startup files */
765 /* "If there are no operands and the -c option is not specified, the -s
766 option shall be assumed." */
771 if (debugging_mode
&& locally_skip_execution
== 0 && running_setuid
== 0 && (reading_shell_script
|| interactive_shell
== 0))
774 /* Do the things that should be done only for interactive shells. */
775 if (interactive_shell
)
777 /* Set up for checking for presence of mail. */
781 #if defined (HISTORY)
782 /* Initialize the interactive history stuff. */
783 bash_initialize_history ();
784 /* Don't load the history from the history file if we've already
785 saved some lines in this session (e.g., by putting `history -s xx'
786 into one of the startup files). */
787 if (shell_initialized
== 0 && history_lines_this_session
== 0)
791 /* Initialize terminal state for interactive shells after the
792 .bash_profile and .bashrc are interpreted. */
796 #if !defined (ONESHOT)
798 #endif /* !ONESHOT */
800 shell_initialized
= 1;
802 if (pretty_print_mode
&& interactive_shell
)
804 internal_warning (_("pretty-printing mode ignored in interactive shells"));
805 pretty_print_mode
= 0;
807 if (pretty_print_mode
)
808 exit_shell (pretty_print_loop ());
810 /* Read commands until exit condition. */
812 exit_shell (last_command_exit_value
);
816 parse_long_options (argv
, arg_start
, arg_end
)
818 int arg_start
, arg_end
;
820 int arg_index
, longarg
, i
;
823 arg_index
= arg_start
;
824 while ((arg_index
!= arg_end
) && (arg_string
= argv
[arg_index
]) &&
825 (*arg_string
== '-'))
829 /* Make --login equivalent to -login. */
830 if (arg_string
[1] == '-' && arg_string
[2])
836 for (i
= 0; long_args
[i
].name
; i
++)
838 if (STREQ (arg_string
+ 1, long_args
[i
].name
))
840 if (long_args
[i
].type
== Int
)
841 *long_args
[i
].int_value
= 1;
842 else if (argv
[++arg_index
] == 0)
844 report_error (_("%s: option requires an argument"), long_args
[i
].name
);
848 *long_args
[i
].char_value
= argv
[arg_index
];
853 if (long_args
[i
].name
== 0)
857 report_error (_("%s: invalid option"), argv
[arg_index
]);
858 show_shell_usage (stderr
, 0);
861 break; /* No such argument. Maybe flag arg. */
871 parse_shell_options (argv
, arg_start
, arg_end
)
873 int arg_start
, arg_end
;
876 int arg_character
, on_or_off
, next_arg
, i
;
877 char *o_option
, *arg_string
;
879 arg_index
= arg_start
;
880 while (arg_index
!= arg_end
&& (arg_string
= argv
[arg_index
]) &&
881 (*arg_string
== '-' || *arg_string
== '+'))
883 /* There are flag arguments, so parse them. */
884 next_arg
= arg_index
+ 1;
886 /* A single `-' signals the end of options. From the 4.3 BSD sh.
887 An option `--' means the same thing; this is the standard
888 getopt(3) meaning. */
889 if (arg_string
[0] == '-' &&
890 (arg_string
[1] == '\0' ||
891 (arg_string
[1] == '-' && arg_string
[2] == '\0')))
895 on_or_off
= arg_string
[0];
896 while (arg_character
= arg_string
[i
++])
898 switch (arg_character
)
901 want_pending_command
= 1;
905 make_login_shell
= 1;
913 o_option
= argv
[next_arg
];
916 set_option_defaults ();
917 list_minus_o_opts (-1, (on_or_off
== '-') ? 0 : 1);
918 reset_option_defaults ();
921 if (set_minus_o_option (on_or_off
, o_option
) != EXECUTION_SUCCESS
)
927 /* Since some of these can be overridden by the normal
928 interactive/non-interactive shell initialization or
929 initializing posix mode, we save the options and process
930 them after initialization. */
931 o_option
= argv
[next_arg
];
934 shopt_listopt (o_option
, (on_or_off
== '-') ? 0 : 1);
937 add_shopt_to_alist (o_option
, on_or_off
);
942 dump_translatable_strings
= 1;
946 if (change_flag (arg_character
, on_or_off
) == FLAG_ERROR
)
948 report_error (_("%c%c: invalid option"), on_or_off
, arg_character
);
949 show_shell_usage (stderr
, 0);
954 /* Can't do just a simple increment anymore -- what about
955 "bash -abouo emacs ignoreeof -hP"? */
956 arg_index
= next_arg
;
962 /* Exit the shell with status S. */
967 fflush (stdout
); /* XXX */
970 /* Clean up the terminal if we are in a state where it's been modified. */
971 #if defined (READLINE)
972 if (RL_ISSTATE (RL_STATE_TERMPREPPED
) && rl_deprep_term_function
)
973 (*rl_deprep_term_function
) ();
975 if (read_tty_modified ())
978 /* Do trap[0] if defined. Allow it to override the exit status
980 if (signal_is_trapped (0))
981 s
= run_exit_trap ();
983 #if defined (PROCESS_SUBSTITUTION)
985 #endif /* PROCESS_SUBSTITUTION */
987 #if defined (HISTORY)
988 if (remember_on_history
)
989 maybe_save_shell_history ();
992 #if defined (COPROCESS_SUPPORT)
996 #if defined (JOB_CONTROL)
997 /* If the user has run `shopt -s huponexit', hangup all jobs when we exit
998 an interactive login shell. ksh does this unconditionally. */
999 if (interactive_shell
&& login_shell
&& hup_on_exit
)
1002 /* If this shell is interactive, or job control is active, terminate all
1003 stopped jobs and restore the original terminal process group. Don't do
1004 this if we're in a subshell and calling exit_shell after, for example,
1005 a failed word expansion. We want to do this even if the shell is not
1006 interactive because we set the terminal's process group when job control
1007 is enabled regardless of the interactive status. */
1008 if (subshell_environment
== 0)
1010 #endif /* JOB_CONTROL */
1012 /* Always return the exit status of the last command to our parent. */
1016 /* A wrapper for exit that (optionally) can do other things, like malloc
1017 statistics tracing. */
1022 #if defined (MALLOC_DEBUG) && defined (USING_BASH_MALLOC)
1023 if (malloc_trace_at_exit
&& (subshell_environment
& (SUBSHELL_COMSUB
|SUBSHELL_PROCSUB
)) == 0)
1024 trace_malloc_stats (get_name_for_error (), (char *)NULL
);
1025 /* mlocation_write_table (); */
1031 /* Exit a subshell, which includes calling the exit trap. We don't want to
1032 do any more cleanup, since a subshell is created as an exact copy of its
1041 /* Do trap[0] if defined. Allow it to override the exit status
1043 if (signal_is_trapped (0))
1044 s
= run_exit_trap ();
1053 set_pipestatus_from_exit (last_command_exit_value
= s
);
1056 /* Source the bash startup files. If POSIXLY_CORRECT is non-zero, we obey
1057 the Posix.2 startup file rules: $ENV is expanded, and if the file it
1058 names exists, that file is sourced. The Posix.2 rules are in effect
1059 for interactive shells only. (section 4.56.5.3) */
1061 /* Execute ~/.bashrc for most shells. Never execute it if
1062 ACT_LIKE_SH is set, or if NO_RC is set.
1064 If the executable file "/usr/gnu/src/bash/foo" contains:
1071 COMMAND EXECUTE BASHRC
1072 --------------------------------
1076 rsh machine ls YES (for rsh, which calls `bash -c')
1077 rsh machine foo YES (for shell started by rsh) NO (for foo!)
1084 execute_env_file (env_file
)
1089 if (env_file
&& *env_file
)
1091 fn
= expand_string_unsplit_to_string (env_file
, Q_DOUBLE_QUOTES
);
1093 maybe_execute_file (fn
, 1);
1099 run_startup_files ()
1101 #if defined (JOB_CONTROL)
1102 int old_job_control
;
1104 int sourced_login
, run_by_ssh
;
1106 /* get the rshd/sshd case out of the way first. */
1107 if (interactive_shell
== 0 && no_rc
== 0 && login_shell
== 0 &&
1108 act_like_sh
== 0 && command_execution_string
)
1110 #ifdef SSH_SOURCE_BASHRC
1111 run_by_ssh
= (find_variable ("SSH_CLIENT") != (SHELL_VAR
*)0) ||
1112 (find_variable ("SSH2_CLIENT") != (SHELL_VAR
*)0);
1117 /* If we were run by sshd or we think we were run by rshd, execute
1118 ~/.bashrc if we are a top-level shell. */
1119 if ((run_by_ssh
|| isnetconn (fileno (stdin
))) && shell_level
< 2)
1122 # if defined (__OPENNT)
1123 maybe_execute_file (_prefixInstallPath(SYS_BASHRC
, NULL
, 0), 1);
1125 maybe_execute_file (SYS_BASHRC
, 1);
1128 maybe_execute_file (bashrc_file
, 1);
1133 #if defined (JOB_CONTROL)
1134 /* Startup files should be run without job control enabled. */
1135 old_job_control
= interactive_shell
? set_job_control (0) : 0;
1140 /* A shell begun with the --login (or -l) flag that is not in posix mode
1141 runs the login shell startup files, no matter whether or not it is
1142 interactive. If NON_INTERACTIVE_LOGIN_SHELLS is defined, run the
1143 startup files if argv[0][0] == '-' as well. */
1144 #if defined (NON_INTERACTIVE_LOGIN_SHELLS)
1145 if (login_shell
&& posixly_correct
== 0)
1147 if (login_shell
< 0 && posixly_correct
== 0)
1150 /* We don't execute .bashrc for login shells. */
1153 /* Execute /etc/profile and one of the personal login shell
1154 initialization files. */
1155 if (no_profile
== 0)
1157 maybe_execute_file (SYS_PROFILE
, 1);
1159 if (act_like_sh
) /* sh */
1160 maybe_execute_file ("~/.profile", 1);
1161 else if ((maybe_execute_file ("~/.bash_profile", 1) == 0) &&
1162 (maybe_execute_file ("~/.bash_login", 1) == 0)) /* bash */
1163 maybe_execute_file ("~/.profile", 1);
1169 /* A non-interactive shell not named `sh' and not in posix mode reads and
1170 executes commands from $BASH_ENV. If `su' starts a shell with `-c cmd'
1171 and `-su' as the name of the shell, we want to read the startup files.
1172 No other non-interactive shells read any startup files. */
1173 if (interactive_shell
== 0 && !(su_shell
&& login_shell
))
1175 if (posixly_correct
== 0 && act_like_sh
== 0 && privileged_mode
== 0 &&
1177 execute_env_file (get_string_value ("BASH_ENV"));
1181 /* Interactive shell or `-su' shell. */
1182 if (posixly_correct
== 0) /* bash, sh */
1184 if (login_shell
&& sourced_login
++ == 0)
1186 /* We don't execute .bashrc for login shells. */
1189 /* Execute /etc/profile and one of the personal login shell
1190 initialization files. */
1191 if (no_profile
== 0)
1193 maybe_execute_file (SYS_PROFILE
, 1);
1195 if (act_like_sh
) /* sh */
1196 maybe_execute_file ("~/.profile", 1);
1197 else if ((maybe_execute_file ("~/.bash_profile", 1) == 0) &&
1198 (maybe_execute_file ("~/.bash_login", 1) == 0)) /* bash */
1199 maybe_execute_file ("~/.profile", 1);
1204 if (act_like_sh
== 0 && no_rc
== 0)
1207 # if defined (__OPENNT)
1208 maybe_execute_file (_prefixInstallPath(SYS_BASHRC
, NULL
, 0), 1);
1210 maybe_execute_file (SYS_BASHRC
, 1);
1213 maybe_execute_file (bashrc_file
, 1);
1216 else if (act_like_sh
&& privileged_mode
== 0 && sourced_env
++ == 0)
1217 execute_env_file (get_string_value ("ENV"));
1219 else /* bash --posix, sh --posix */
1222 if (interactive_shell
&& privileged_mode
== 0 && sourced_env
++ == 0)
1223 execute_env_file (get_string_value ("ENV"));
1226 #if defined (JOB_CONTROL)
1227 set_job_control (old_job_control
);
1231 #if defined (RESTRICTED_SHELL)
1232 /* Return 1 if the shell should be a restricted one based on NAME or the
1233 value of `restricted'. Don't actually do anything, just return a
1236 shell_is_restricted (name
)
1243 temp
= base_pathname (name
);
1246 return (STREQ (temp
, RESTRICTED_SHELL_NAME
));
1249 /* Perhaps make this shell a `restricted' one, based on NAME. If the
1250 basename of NAME is "rbash", then this shell is restricted. The
1251 name of the restricted shell is a configurable option, see config.h.
1252 In a restricted shell, PATH, SHELL, ENV, and BASH_ENV are read-only
1254 Do this also if `restricted' is already set to 1; maybe the shell was
1257 maybe_make_restricted (name
)
1262 temp
= base_pathname (name
);
1265 if (restricted
|| (STREQ (temp
, RESTRICTED_SHELL_NAME
)))
1267 #if defined (RBASH_STATIC_PATH_VALUE)
1268 bind_variable ("PATH", RBASH_STATIC_PATH_VALUE
, 0);
1269 stupidly_hack_special_variables ("PATH"); /* clear hash table */
1271 set_var_read_only ("PATH");
1272 set_var_read_only ("SHELL");
1273 set_var_read_only ("ENV");
1274 set_var_read_only ("BASH_ENV");
1275 set_var_read_only ("HISTFILE");
1278 return (restricted
);
1280 #endif /* RESTRICTED_SHELL */
1282 /* Fetch the current set of uids and gids and return 1 if we're running
1283 setuid or setgid. */
1290 if (current_user
.uid
!= u
)
1292 FREE (current_user
.user_name
);
1293 FREE (current_user
.shell
);
1294 FREE (current_user
.home_dir
);
1295 current_user
.user_name
= current_user
.shell
= current_user
.home_dir
= (char *)NULL
;
1297 current_user
.uid
= u
;
1298 current_user
.gid
= getgid ();
1299 current_user
.euid
= geteuid ();
1300 current_user
.egid
= getegid ();
1302 /* See whether or not we are running setuid or setgid. */
1303 return (current_user
.uid
!= current_user
.euid
) ||
1304 (current_user
.gid
!= current_user
.egid
);
1308 disable_priv_mode ()
1313 if (setresuid (current_user
.uid
, current_user
.uid
, current_user
.uid
) < 0)
1315 if (setuid (current_user
.uid
) < 0)
1319 sys_error (_("cannot set uid to %d: effective uid %d"), current_user
.uid
, current_user
.euid
);
1320 #if defined (EXIT_ON_SETUID_FAILURE)
1326 if (setresgid (current_user
.gid
, current_user
.gid
, current_user
.gid
) < 0)
1328 if (setgid (current_user
.gid
) < 0)
1330 sys_error (_("cannot set gid to %d: effective gid %d"), current_user
.gid
, current_user
.egid
);
1332 current_user
.euid
= current_user
.uid
;
1333 current_user
.egid
= current_user
.gid
;
1336 #if defined (WORDEXP_OPTION)
1342 WORD_LIST
*wl
, *tl
, *result
;
1344 code
= setjmp_nosigs (top_level
);
1346 if (code
!= NOT_JUMPED
)
1350 /* Some kind of throw to top_level has occurred. */
1352 return last_command_exit_value
= 127;
1355 return last_command_exit_value
;
1357 return last_command_exit_value
= 1;
1359 command_error ("run_wordexp", CMDERR_BADJUMP
, code
, 0);
1363 /* Run it through the parser to get a list of words and expand them */
1364 if (words
&& *words
)
1366 with_input_from_string (words
, "--wordexp");
1367 if (parse_command () != 0)
1369 if (global_command
== 0)
1374 if (global_command
->type
!= cm_simple
)
1376 wl
= global_command
->value
.Simple
->words
;
1378 for (tl
= wl
; tl
; tl
= tl
->next
)
1379 tl
->word
->flags
|= W_NOCOMSUB
|W_NOPROCSUB
;
1380 result
= wl
? expand_words_no_vars (wl
) : (WORD_LIST
*)0;
1383 result
= (WORD_LIST
*)0;
1385 last_command_exit_value
= 0;
1393 /* Count up the number of words and bytes, and print them. Don't count
1394 the trailing NUL byte. */
1395 for (nw
= nb
= 0, wl
= result
; wl
; wl
= wl
->next
)
1398 nb
+= strlen (wl
->word
->word
);
1400 printf ("%u\n%u\n", nw
, nb
);
1401 /* Print each word on a separate line. This will have to be changed when
1402 the interface to glibc is completed. */
1403 for (wl
= result
; wl
; wl
= wl
->next
)
1404 printf ("%s\n", wl
->word
->word
);
1410 #if defined (ONESHOT)
1411 /* Run one command, given as the argument to the -c option. Tell
1412 parse_and_execute not to fork for a simple command. */
1414 run_one_command (command
)
1419 code
= setjmp_nosigs (top_level
);
1421 if (code
!= NOT_JUMPED
)
1423 #if defined (PROCESS_SUBSTITUTION)
1424 unlink_fifo_list ();
1425 #endif /* PROCESS_SUBSTITUTION */
1428 /* Some kind of throw to top_level has occurred. */
1430 return last_command_exit_value
= 127;
1433 return last_command_exit_value
;
1435 return last_command_exit_value
= 1;
1437 command_error ("run_one_command", CMDERR_BADJUMP
, code
, 0);
1440 return (parse_and_execute (savestring (command
), "-c", SEVAL_NOHIST
|SEVAL_RESETLINE
));
1442 #endif /* ONESHOT */
1445 bind_args (argv
, arg_start
, arg_end
, start_index
)
1447 int arg_start
, arg_end
, start_index
;
1450 WORD_LIST
*args
, *tl
;
1452 for (i
= arg_start
, args
= tl
= (WORD_LIST
*)NULL
; i
< arg_end
; i
++)
1455 args
= tl
= make_word_list (make_word (argv
[i
]), args
);
1458 tl
->next
= make_word_list (make_word (argv
[i
]), (WORD_LIST
*)NULL
);
1465 if (start_index
== 0) /* bind to $0...$n for sh -c command */
1467 /* Posix.2 4.56.3 says that the first argument after sh -c command
1468 becomes $0, and the rest of the arguments become $1...$n */
1469 shell_name
= savestring (args
->word
->word
);
1470 FREE (dollar_vars
[0]);
1471 dollar_vars
[0] = savestring (args
->word
->word
);
1472 remember_args (args
->next
, 1);
1475 push_args (args
->next
); /* BASH_ARGV and BASH_ARGC */
1476 bash_argv_initialized
= 1;
1479 else /* bind to $1...$n for shell script */
1481 remember_args (args
, 1);
1482 /* We do this unconditionally so something like -O extdebug doesn't
1483 do it first. We're setting the definitive positional params
1487 push_args (args
); /* BASH_ARGV and BASH_ARGC */
1488 bash_argv_initialized
= 1;
1492 dispose_words (args
);
1501 remember_args ((WORD_LIST
*)NULL
, 1);
1502 pop_args (); /* Reset BASH_ARGV and BASH_ARGC */
1508 #if defined (DEBUGGER) && defined (DEBUGGER_START_FILE)
1512 old_errexit
= exit_immediately_on_error
;
1513 exit_immediately_on_error
= 0;
1515 r
= force_execute_file (DEBUGGER_START_FILE
, 1);
1518 internal_warning (_("cannot start debugger; debugging mode disabled"));
1521 error_trace_mode
= function_trace_mode
= debugging_mode
;
1526 exit_immediately_on_error
+= old_errexit
;
1531 open_shell_script (script_name
)
1534 int fd
, e
, fd_is_tty
;
1535 char *filename
, *path_filename
, *t
;
1539 #if defined (ARRAY_VARS)
1540 SHELL_VAR
*funcname_v
, *bash_source_v
, *bash_lineno_v
;
1541 ARRAY
*funcname_a
, *bash_source_a
, *bash_lineno_a
;
1544 filename
= savestring (script_name
);
1546 fd
= open (filename
, O_RDONLY
);
1547 if ((fd
< 0) && (errno
== ENOENT
) && (absolute_program (filename
) == 0))
1550 /* If it's not in the current directory, try looking through PATH
1552 path_filename
= find_path_file (script_name
);
1556 filename
= path_filename
;
1557 fd
= open (filename
, O_RDONLY
);
1566 file_error (filename
);
1567 #if defined (JOB_CONTROL)
1568 end_job_control (); /* just in case we were run as bash -i script */
1570 sh_exit ((e
== ENOENT
) ? EX_NOTFOUND
: EX_NOINPUT
);
1573 free (dollar_vars
[0]);
1574 dollar_vars
[0] = exec_argv0
? savestring (exec_argv0
) : savestring (script_name
);
1578 exec_argv0
= (char *)NULL
;
1581 if (file_isdir (filename
))
1583 #if defined (EISDIR)
1588 file_error (filename
);
1589 #if defined (JOB_CONTROL)
1590 end_job_control (); /* just in case we were run as bash -i script */
1592 sh_exit (EX_NOINPUT
);
1595 #if defined (ARRAY_VARS)
1596 GET_ARRAY_FROM_VAR ("FUNCNAME", funcname_v
, funcname_a
);
1597 GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v
, bash_source_a
);
1598 GET_ARRAY_FROM_VAR ("BASH_LINENO", bash_lineno_v
, bash_lineno_a
);
1600 array_push (bash_source_a
, filename
);
1603 t
= itos (executing_line_number ());
1604 array_push (bash_lineno_a
, t
);
1607 array_push (funcname_a
, "main");
1611 fd_is_tty
= isatty (fd
);
1616 /* Only do this with non-tty file descriptors we can seek on. */
1617 if (fd_is_tty
== 0 && (lseek (fd
, 0L, 1) != -1))
1619 /* Check to see if the `file' in `bash file' is a binary file
1620 according to the same tests done by execute_simple_command (),
1621 and report an error and exit if it is. */
1622 sample_len
= read (fd
, sample
, sizeof (sample
));
1626 if ((fstat (fd
, &sb
) == 0) && S_ISDIR (sb
.st_mode
))
1628 #if defined (EISDIR)
1630 file_error (filename
);
1632 internal_error (_("%s: Is a directory"), filename
);
1638 file_error (filename
);
1640 #if defined (JOB_CONTROL)
1641 end_job_control (); /* just in case we were run as bash -i script */
1645 else if (sample_len
> 0 && (check_binary_file (sample
, sample_len
)))
1647 internal_error (_("%s: cannot execute binary file"), filename
);
1648 #if defined (JOB_CONTROL)
1649 end_job_control (); /* just in case we were run as bash -i script */
1651 exit (EX_BINARY_FILE
);
1653 /* Now rewind the file back to the beginning. */
1657 /* Open the script. But try to move the file descriptor to a randomly
1658 large one, in the hopes that any descriptors used by the script will
1659 not match with ours. */
1660 fd
= move_to_high_fd (fd
, 1, -1);
1662 #if defined (BUFFERED_INPUT)
1663 default_buffered_input
= fd
;
1664 SET_CLOSE_ON_EXEC (default_buffered_input
);
1665 #else /* !BUFFERED_INPUT */
1666 default_input
= fdopen (fd
, "r");
1668 if (default_input
== 0)
1670 file_error (filename
);
1674 SET_CLOSE_ON_EXEC (fd
);
1675 if (fileno (default_input
) != fd
)
1676 SET_CLOSE_ON_EXEC (fileno (default_input
));
1677 #endif /* !BUFFERED_INPUT */
1679 /* Just about the only way for this code to be executed is if something
1680 like `bash -i /dev/stdin' is executed. */
1681 if (interactive_shell
&& fd_is_tty
)
1686 #if defined (BUFFERED_INPUT)
1687 default_buffered_input
= 0;
1689 fclose (default_input
);
1690 default_input
= stdin
;
1693 else if (forced_interactive
&& fd_is_tty
== 0)
1694 /* But if a script is called with something like `bash -i scriptname',
1695 we need to do a non-interactive setup here, since we didn't do it
1697 init_interactive_script ();
1701 reading_shell_script
= 1;
1705 /* Initialize the input routines for the parser. */
1709 /* Make sure the fd from which we are reading input is not in
1711 #if defined (BUFFERED_INPUT)
1712 if (interactive
== 0)
1713 sh_unset_nodelay_mode (default_buffered_input
);
1715 #endif /* !BUFFERED_INPUT */
1716 sh_unset_nodelay_mode (fileno (stdin
));
1718 /* with_input_from_stdin really means `with_input_from_readline' */
1719 if (interactive
&& no_line_editing
== 0)
1720 with_input_from_stdin ();
1721 #if defined (BUFFERED_INPUT)
1722 else if (interactive
== 0)
1723 with_input_from_buffered_stream (default_buffered_input
, dollar_vars
[0]);
1724 #endif /* BUFFERED_INPUT */
1726 with_input_from_stream (default_input
, dollar_vars
[0]);
1729 /* Close the current shell script input source and forget about it. This is
1730 extern so execute_cmd.c:initialize_subshell() can call it. If CHECK_ZERO
1731 is non-zero, we close default_buffered_input even if it's the standard
1734 unset_bash_input (check_zero
)
1737 #if defined (BUFFERED_INPUT)
1738 if ((check_zero
&& default_buffered_input
>= 0) ||
1739 (check_zero
== 0 && default_buffered_input
> 0))
1741 close_buffered_fd (default_buffered_input
);
1742 default_buffered_input
= bash_input
.location
.buffered_fd
= -1;
1743 bash_input
.type
= st_none
; /* XXX */
1745 #else /* !BUFFERED_INPUT */
1748 fclose (default_input
);
1749 default_input
= (FILE *)NULL
;
1751 #endif /* !BUFFERED_INPUT */
1755 #if !defined (PROGRAM)
1756 # define PROGRAM "bash"
1760 set_shell_name (argv0
)
1763 /* Here's a hack. If the name of this shell is "sh", then don't do
1764 any startup files; just try to be more like /bin/sh. */
1765 shell_name
= argv0
? base_pathname (argv0
) : PROGRAM
;
1767 if (argv0
&& *argv0
== '-')
1769 if (*shell_name
== '-')
1774 if (shell_name
[0] == 's' && shell_name
[1] == 'h' && shell_name
[2] == '\0')
1776 if (shell_name
[0] == 's' && shell_name
[1] == 'u' && shell_name
[2] == '\0')
1779 shell_name
= argv0
? argv0
: PROGRAM
;
1780 FREE (dollar_vars
[0]);
1781 dollar_vars
[0] = savestring (shell_name
);
1783 /* A program may start an interactive shell with
1784 "execl ("/bin/bash", "-", NULL)".
1785 If so, default the name of this shell to our name. */
1786 if (!shell_name
|| !*shell_name
|| (shell_name
[0] == '-' && !shell_name
[1]))
1787 shell_name
= PROGRAM
;
1790 /* Some options are initialized to -1 so we have a way to determine whether
1791 they were set on the command line. This is an issue when listing the option
1792 values at invocation (`bash -o'), so we set the defaults here and reset
1793 them after the call to list_minus_o_options (). */
1794 /* XXX - could also do this for histexp_flag, jobs_m_flag */
1796 set_option_defaults ()
1798 #if defined (HISTORY)
1799 enable_history_list
= 0;
1804 reset_option_defaults ()
1806 #if defined (HISTORY)
1807 enable_history_list
= -1;
1814 expand_aliases
= interactive_shell
= startup_state
= 1;
1816 #if defined (HISTORY)
1817 if (enable_history_list
== -1)
1818 enable_history_list
= 1; /* set default */
1819 remember_on_history
= enable_history_list
;
1820 # if defined (BANG_HISTORY)
1821 histexp_flag
= history_expansion
; /* XXX */
1827 init_noninteractive ()
1829 #if defined (HISTORY)
1830 if (enable_history_list
== -1) /* set default */
1831 enable_history_list
= 0;
1832 bash_history_reinit (0);
1833 #endif /* HISTORY */
1834 interactive_shell
= startup_state
= interactive
= 0;
1835 expand_aliases
= posixly_correct
; /* XXX - was 0 not posixly_correct */
1836 no_line_editing
= 1;
1837 #if defined (JOB_CONTROL)
1838 /* Even if the shell is not interactive, enable job control if the -i or
1839 -m option is supplied at startup. */
1840 set_job_control (forced_interactive
||jobs_m_flag
);
1841 #endif /* JOB_CONTROL */
1845 init_interactive_script ()
1847 #if defined (HISTORY)
1848 if (enable_history_list
== -1)
1849 enable_history_list
= 1;
1851 init_noninteractive ();
1852 expand_aliases
= interactive_shell
= startup_state
= 1;
1853 #if defined (HISTORY)
1854 remember_on_history
= enable_history_list
; /* XXX */
1859 get_current_user_info ()
1861 struct passwd
*entry
;
1863 /* Don't fetch this more than once. */
1864 if (current_user
.user_name
== 0)
1866 #if defined (__TANDEM)
1867 entry
= getpwnam (getlogin ());
1869 entry
= getpwuid (current_user
.uid
);
1873 current_user
.user_name
= savestring (entry
->pw_name
);
1874 current_user
.shell
= (entry
->pw_shell
&& entry
->pw_shell
[0])
1875 ? savestring (entry
->pw_shell
)
1876 : savestring ("/bin/sh");
1877 current_user
.home_dir
= savestring (entry
->pw_dir
);
1881 current_user
.user_name
= _("I have no name!");
1882 current_user
.user_name
= savestring (current_user
.user_name
);
1883 current_user
.shell
= savestring ("/bin/sh");
1884 current_user
.home_dir
= savestring ("/");
1886 #if defined (HAVE_GETPWENT)
1892 /* Do whatever is necessary to initialize the shell.
1893 Put new initializations in here. */
1898 int should_be_restricted
;
1900 /* Line buffer output for stderr and stdout. */
1901 if (shell_initialized
== 0)
1903 sh_setlinebuf (stderr
);
1904 sh_setlinebuf (stdout
);
1907 /* Sort the array of shell builtins so that the binary search in
1908 find_shell_builtin () works correctly. */
1909 initialize_shell_builtins ();
1911 /* Initialize the trap signal handlers before installing our own
1912 signal handlers. traps.c:restore_original_signals () is responsible
1913 for restoring the original default signal handlers. That function
1914 is called when we make a new child. */
1915 initialize_traps ();
1916 initialize_signals (0);
1918 /* It's highly unlikely that this will change. */
1919 if (current_host_name
== 0)
1921 /* Initialize current_host_name. */
1922 if (gethostname (hostname
, 255) < 0)
1923 current_host_name
= "??host??";
1925 current_host_name
= savestring (hostname
);
1928 /* Initialize the stuff in current_user that comes from the password
1929 file. We don't need to do this right away if the shell is not
1931 if (interactive_shell
)
1932 get_current_user_info ();
1934 /* Initialize our interface to the tilde expander. */
1935 tilde_initialize ();
1937 #if defined (RESTRICTED_SHELL)
1938 should_be_restricted
= shell_is_restricted (shell_name
);
1941 /* Initialize internal and environment variables. Don't import shell
1942 functions from the environment if we are running in privileged or
1943 restricted mode or if the shell is running setuid. */
1944 #if defined (RESTRICTED_SHELL)
1945 initialize_shell_variables (shell_environment
, privileged_mode
||restricted
||should_be_restricted
||running_setuid
);
1947 initialize_shell_variables (shell_environment
, privileged_mode
||running_setuid
);
1950 /* Initialize the data structures for storing and running jobs. */
1951 initialize_job_control (jobs_m_flag
);
1953 /* Initialize input streams to null. */
1954 initialize_bash_input ();
1956 initialize_flags ();
1958 /* Initialize the shell options. Don't import the shell options
1959 from the environment variables $SHELLOPTS or $BASHOPTS if we are
1960 running in privileged or restricted mode or if the shell is running
1962 #if defined (RESTRICTED_SHELL)
1963 initialize_shell_options (privileged_mode
||restricted
||should_be_restricted
||running_setuid
);
1964 initialize_bashopts (privileged_mode
||restricted
||should_be_restricted
||running_setuid
);
1966 initialize_shell_options (privileged_mode
||running_setuid
);
1967 initialize_bashopts (privileged_mode
||running_setuid
);
1971 /* Function called by main () when it appears that the shell has already
1972 had some initialization performed. This is supposed to reset the world
1973 back to a pristine state, as if we had been exec'ed. */
1975 shell_reinitialize ()
1977 /* The default shell prompts. */
1978 primary_prompt
= PPROMPT
;
1979 secondary_prompt
= SPROMPT
;
1981 /* Things that get 1. */
1982 current_command_number
= 1;
1984 /* We have decided that the ~/.bashrc file should not be executed
1985 for the invocation of each shell script. If the variable $ENV
1986 (or $BASH_ENV) is set, its value is used as the name of a file
1988 no_rc
= no_profile
= 1;
1990 /* Things that get 0. */
1991 login_shell
= make_login_shell
= interactive
= executing
= 0;
1992 debugging
= do_version
= line_number
= last_command_exit_value
= 0;
1993 forced_interactive
= interactive_shell
= 0;
1994 subshell_environment
= running_in_background
= 0;
1996 bash_argv_initialized
= 0;
1998 /* XXX - should we set jobs_m_flag to 0 here? */
2000 #if defined (HISTORY)
2001 bash_history_reinit (enable_history_list
= 0);
2002 #endif /* HISTORY */
2004 #if defined (RESTRICTED_SHELL)
2006 #endif /* RESTRICTED_SHELL */
2008 /* Ensure that the default startup file is used. (Except that we don't
2009 execute this file for reinitialized shells). */
2010 bashrc_file
= DEFAULT_BASHRC
;
2012 /* Delete all variables and functions. They will be reinitialized when
2013 the environment is parsed. */
2014 delete_all_contexts (shell_variables
);
2015 delete_all_variables (shell_functions
);
2017 reinit_special_variables ();
2019 #if defined (READLINE)
2020 bashline_reinitialize ();
2023 shell_reinitialized
= 1;
2027 show_shell_usage (fp
, extra
)
2032 char *set_opts
, *s
, *t
;
2035 fprintf (fp
, _("GNU bash, version %s-(%s)\n"), shell_version_string (), MACHTYPE
);
2036 fprintf (fp
, _("Usage:\t%s [GNU long option] [option] ...\n\t%s [GNU long option] [option] script-file ...\n"),
2037 shell_name
, shell_name
);
2038 fputs (_("GNU long options:\n"), fp
);
2039 for (i
= 0; long_args
[i
].name
; i
++)
2040 fprintf (fp
, "\t--%s\n", long_args
[i
].name
);
2042 fputs (_("Shell options:\n"), fp
);
2043 fputs (_("\t-ilrsD or -c command or -O shopt_option\t\t(invocation only)\n"), fp
);
2045 for (i
= 0, set_opts
= 0; shell_builtins
[i
].name
; i
++)
2046 if (STREQ (shell_builtins
[i
].name
, "set"))
2048 set_opts
= savestring (shell_builtins
[i
].short_doc
);
2054 s
= strchr (set_opts
, '[');
2059 t
= strchr (s
, ']');
2062 fprintf (fp
, _("\t-%s or -o option\n"), s
);
2068 fprintf (fp
, _("Type `%s -c \"help set\"' for more information about shell options.\n"), shell_name
);
2069 fprintf (fp
, _("Type `%s -c help' for more information about shell builtin commands.\n"), shell_name
);
2070 fprintf (fp
, _("Use the `bashbug' command to report bugs.\n"));
2072 fprintf (fp
, _("bash home page: <http://www.gnu.org/software/bash>\n"));
2073 fprintf (fp
, _("General help using GNU software: <http://www.gnu.org/gethelp/>\n"));
2078 add_shopt_to_alist (opt
, on_or_off
)
2082 if (shopt_ind
>= shopt_len
)
2085 shopt_alist
= (STRING_INT_ALIST
*)xrealloc (shopt_alist
, shopt_len
* sizeof (shopt_alist
[0]));
2087 shopt_alist
[shopt_ind
].word
= opt
;
2088 shopt_alist
[shopt_ind
].token
= on_or_off
;
2097 for (i
= 0; i
< shopt_ind
; i
++)
2098 if (shopt_setopt (shopt_alist
[i
].word
, (shopt_alist
[i
].token
== '-')) != EXECUTION_SUCCESS
)
2102 shopt_ind
= shopt_len
= 0;