diff options
-rw-r--r-- | shell/ash.c | 17 | ||||
-rw-r--r-- | shell/hush.c | 1 |
2 files changed, 8 insertions, 10 deletions
diff --git a/shell/ash.c b/shell/ash.c index 864b8f0a4..0dd440c61 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -13277,11 +13277,12 @@ procargs(char **argv) } /* - * Read /etc/profile or .profile. + * Read /etc/profile, ~/.profile, $ENV. */ static void read_profile(const char *name) { + name = expandstr(name); if (setinputfile(name, INPUT_PUSH_FILE | INPUT_NOFILE_OK) < 0) return; cmdloop(0); @@ -13325,7 +13326,6 @@ extern int etext(); int ash_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int ash_main(int argc UNUSED_PARAM, char **argv) { - const char *shinit; volatile smallint state; struct jmploc jmploc; struct stackmark smark; @@ -13394,11 +13394,8 @@ int ash_main(int argc UNUSED_PARAM, char **argv) state1: state = 2; hp = lookupvar("HOME"); - if (hp) { - hp = concat_path_file(hp, ".profile"); - read_profile(hp); - free((char*)hp); - } + if (hp) + read_profile("$HOME/.profile"); } state2: state = 3; @@ -13408,11 +13405,11 @@ int ash_main(int argc UNUSED_PARAM, char **argv) #endif iflag ) { - shinit = lookupvar("ENV"); - if (shinit != NULL && *shinit != '\0') { + const char *shinit = lookupvar("ENV"); + if (shinit != NULL && *shinit != '\0') read_profile(shinit); - } } + popstackmark(&smark); state3: state = 4; if (minusc) { diff --git a/shell/hush.c b/shell/hush.c index d7a0d761e..c80429d5c 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -8405,6 +8405,7 @@ int hush_main(int argc, char **argv) * "bash <script>" (which is never interactive (unless -i?)) * sources $BASH_ENV here (without scanning $PATH). * If called as sh, does the same but with $ENV. + * Also NB, per POSIX, $ENV should undergo parameter expansion. */ G.global_argc--; G.global_argv++; |