Based on christos@NetBSD's patch --- shell.c.christos 2014-01-14 08:04:32.000000000 -0500 +++ shell.c 2014-09-25 16:11:51.000000000 -0400 @@ -229,6 +229,7 @@ #else int posixly_correct = 0; /* Non-zero means posix.2 superset. */ #endif +int import_functions = IMPORT_FUNCTIONS_DEF; /* Import functions from environment */ /* Some long-winded argument names. These are obviously new. */ #define Int 1 @@ -248,6 +249,7 @@ { "help", Int, &want_initial_help, (char **)0x0 }, { "init-file", Charp, (int *)0x0, &bashrc_file }, { "login", Int, &make_login_shell, (char **)0x0 }, + { "import-functions", Int, &import_functions, (char **)0x0 }, { "noediting", Int, &no_line_editing, (char **)0x0 }, { "noprofile", Int, &no_profile, (char **)0x0 }, { "norc", Int, &no_rc, (char **)0x0 }, --- variables.c.orig 2014-09-28 11:15:53.189768951 -0500 +++ variables.c 2014-09-28 11:27:07.250722694 -0500 @@ -110,6 +110,7 @@ extern time_t shell_start_time; extern int assigning_in_environment; extern int executing_builtin; extern int funcnest_max; +extern int import_functions; #if defined (READLINE) extern int no_line_editing; @@ -328,6 +329,7 @@ initialize_shell_variables (env, privmod char *name, *string, *temp_string; int c, char_index, string_index, string_length, ro; SHELL_VAR *temp_var; + int skipped_import; create_variable_tables (); @@ -352,9 +354,12 @@ initialize_shell_variables (env, privmod temp_var = (SHELL_VAR *)NULL; + skipped_import = 0; +reval: + /* If exported function, define it now. Don't import functions from the environment in privileged mode. */ - if (privmode == 0 && read_but_dont_execute == 0 && + if (skipped_import == 0 && privmode == 0 && read_but_dont_execute == 0 && STREQN (BASHFUNC_PREFIX, name, BASHFUNC_PREFLEN) && STREQ (BASHFUNC_SUFFIX, name + char_index - BASHFUNC_SUFFLEN) && STREQN ("() {", string, 4)) @@ -367,6 +372,12 @@ initialize_shell_variables (env, privmod tname = name + BASHFUNC_PREFLEN; /* start of func name */ tname[namelen] = '\0'; /* now tname == func name */ + if (!import_functions && !interactive_shell) { + skipped_import = 1; + report_error (_("Skipping importing function definition for `%s': --import-functions required."), tname); + goto reval; + } + string_length = strlen (string); temp_string = (char *)xmalloc (namelen + string_length + 2);