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: */
|
/* from var.c: */
|
||||||
{
|
{
|
||||||
char **envp;
|
char **envp;
|
||||||
char ppid[sizeof(int)*3 + 1];
|
char ppid[sizeof(int)*3 + 2];
|
||||||
const char *p;
|
const char *p;
|
||||||
struct stat st1, st2;
|
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);
|
setvar("PPID", ppid, 0);
|
||||||
|
|
||||||
p = lookupvar("PWD");
|
p = lookupvar("PWD");
|
||||||
|
61
shell/hush.c
61
shell/hush.c
@ -58,7 +58,7 @@
|
|||||||
* TODOs:
|
* TODOs:
|
||||||
* grep for "TODO" and fix (some of them are easy)
|
* grep for "TODO" and fix (some of them are easy)
|
||||||
* builtins: ulimit
|
* builtins: ulimit
|
||||||
* special variables (PWD etc)
|
* special variables (done: PWD)
|
||||||
* follow IFS rules more precisely, including update semantics
|
* follow IFS rules more precisely, including update semantics
|
||||||
* export builtin should be special, its arguments are assignments
|
* export builtin should be special, its arguments are assignments
|
||||||
* and therefore expansion of them should be "one-word" expansion:
|
* 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;
|
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)
|
static int unset_local_var_len(const char *name, int name_len)
|
||||||
{
|
{
|
||||||
struct variable *cur;
|
struct variable *cur;
|
||||||
@ -1604,6 +1611,9 @@ static const char* setup_prompt_string(int promptmode)
|
|||||||
/* Set up the prompt */
|
/* Set up the prompt */
|
||||||
if (promptmode == 0) { /* PS1 */
|
if (promptmode == 0) { /* PS1 */
|
||||||
free((char*)G.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) ? '$' : '#');
|
G.PS1 = xasprintf("%s %c ", get_cwd(0), (geteuid() != 0) ? '$' : '#');
|
||||||
prompt_str = G.PS1;
|
prompt_str = G.PS1;
|
||||||
} else
|
} else
|
||||||
@ -6432,8 +6442,49 @@ int hush_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
e++;
|
e++;
|
||||||
}
|
}
|
||||||
|
/* reinstate HUSH_VERSION */
|
||||||
debug_printf_env("putenv '%s'\n", hush_version_str);
|
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
|
#if ENABLE_FEATURE_EDITING
|
||||||
G.line_input_state = new_line_input_t(FOR_SHELL);
|
G.line_input_state = new_line_input_t(FOR_SHELL);
|
||||||
#endif
|
#endif
|
||||||
@ -6816,7 +6867,11 @@ static int FAST_FUNC builtin_cd(char **argv)
|
|||||||
bb_perror_msg("cd: %s", newdir);
|
bb_perror_msg("cd: %s", newdir);
|
||||||
return EXIT_FAILURE;
|
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;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user