hush: export PWD
function old new delta set_pwd_var - 36 +36 hush_main 941 951 +10 evalvar 1365 1363 -2 ash_main 1364 1362 -2 builtin_cd 75 72 -3 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 1/3 up/down: 46/-7) Total: 39 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
2cc709139e
commit
6db4784d27
@ -12985,7 +12985,7 @@ init(void)
|
||||
/* from var.c: */
|
||||
{
|
||||
char **envp;
|
||||
char ppid[sizeof(int)*3 + 1];
|
||||
char ppid[sizeof(int)*3 + 2];
|
||||
const char *p;
|
||||
struct stat st1, st2;
|
||||
|
||||
@ -12996,7 +12996,7 @@ init(void)
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(ppid, sizeof(ppid), "%u", (unsigned) getppid());
|
||||
sprintf(ppid, "%u", (unsigned) getppid());
|
||||
setvar("PPID", ppid, 0);
|
||||
|
||||
p = lookupvar("PWD");
|
||||
|
61
shell/hush.c
61
shell/hush.c
@ -58,7 +58,7 @@
|
||||
* TODOs:
|
||||
* grep for "TODO" and fix (some of them are easy)
|
||||
* builtins: ulimit
|
||||
* special variables (PWD etc)
|
||||
* special variables (done: PWD)
|
||||
* follow IFS rules more precisely, including update semantics
|
||||
* export builtin should be special, its arguments are assignments
|
||||
* and therefore expansion of them should be "one-word" expansion:
|
||||
@ -1432,6 +1432,13 @@ static int set_local_var(char *str, int flg_export, int local_lvl, int flg_read_
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Used at startup and after each cd */
|
||||
static void set_pwd_var(int exp)
|
||||
{
|
||||
set_local_var(xasprintf("PWD=%s", get_cwd(/*force:*/ 1)),
|
||||
/*exp:*/ exp, /*lvl:*/ 0, /*ro:*/ 0);
|
||||
}
|
||||
|
||||
static int unset_local_var_len(const char *name, int name_len)
|
||||
{
|
||||
struct variable *cur;
|
||||
@ -1604,6 +1611,9 @@ static const char* setup_prompt_string(int promptmode)
|
||||
/* Set up the prompt */
|
||||
if (promptmode == 0) { /* PS1 */
|
||||
free((char*)G.PS1);
|
||||
/* bash uses $PWD value, even if it is set by user.
|
||||
* It uses current dir only if PWD is unset.
|
||||
* We always use current dir. */
|
||||
G.PS1 = xasprintf("%s %c ", get_cwd(0), (geteuid() != 0) ? '$' : '#');
|
||||
prompt_str = G.PS1;
|
||||
} else
|
||||
@ -6432,8 +6442,49 @@ int hush_main(int argc, char **argv)
|
||||
}
|
||||
e++;
|
||||
}
|
||||
/* reinstate HUSH_VERSION */
|
||||
debug_printf_env("putenv '%s'\n", hush_version_str);
|
||||
putenv((char *)hush_version_str); /* reinstate HUSH_VERSION */
|
||||
putenv((char *)hush_version_str);
|
||||
|
||||
/* Export PWD */
|
||||
set_pwd_var(/*exp:*/ 1);
|
||||
/* bash also exports SHLVL and _,
|
||||
* and sets (but doesn't export) the following variables:
|
||||
* BASH=/bin/bash
|
||||
* BASH_VERSINFO=([0]="3" [1]="2" [2]="0" [3]="1" [4]="release" [5]="i386-pc-linux-gnu")
|
||||
* BASH_VERSION='3.2.0(1)-release'
|
||||
* HOSTTYPE=i386
|
||||
* MACHTYPE=i386-pc-linux-gnu
|
||||
* OSTYPE=linux-gnu
|
||||
* HOSTNAME=<xxxxxxxxxx>
|
||||
* PPID=<NNNNN>
|
||||
* EUID=<NNNNN>
|
||||
* UID=<NNNNN>
|
||||
* GROUPS=()
|
||||
* LINES=<NNN>
|
||||
* COLUMNS=<NNN>
|
||||
* BASH_ARGC=()
|
||||
* BASH_ARGV=()
|
||||
* BASH_LINENO=()
|
||||
* BASH_SOURCE=()
|
||||
* DIRSTACK=()
|
||||
* PIPESTATUS=([0]="0")
|
||||
* HISTFILE=/<xxx>/.bash_history
|
||||
* HISTFILESIZE=500
|
||||
* HISTSIZE=500
|
||||
* MAILCHECK=60
|
||||
* PATH=/usr/gnu/bin:/usr/local/bin:/bin:/usr/bin:.
|
||||
* SHELL=/bin/bash
|
||||
* SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
|
||||
* TERM=dumb
|
||||
* OPTERR=1
|
||||
* OPTIND=1
|
||||
* IFS=$' \t\n'
|
||||
* PS1='\s-\v\$ '
|
||||
* PS2='> '
|
||||
* PS4='+ '
|
||||
*/
|
||||
|
||||
#if ENABLE_FEATURE_EDITING
|
||||
G.line_input_state = new_line_input_t(FOR_SHELL);
|
||||
#endif
|
||||
@ -6816,7 +6867,11 @@ static int FAST_FUNC builtin_cd(char **argv)
|
||||
bb_perror_msg("cd: %s", newdir);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
get_cwd(1);
|
||||
/* Read current dir (get_cwd(1) is inside) and set PWD.
|
||||
* Note: do not enforce exporting. If PWD was unset or unexported,
|
||||
* set it again, but do not export. bash does the same.
|
||||
*/
|
||||
set_pwd_var(/*exp:*/ 0);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user