hush: implement $-, set default PATH if it is not set on startup
function old new delta expand_one_var 2311 2362 +51 hush_main 1075 1104 +29 parse_dollar 790 791 +1 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 3/0 up/down: 81/0) Total: 81 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
0c36019369
commit
ef8985c688
31
shell/hush.c
31
shell/hush.c
@ -466,9 +466,9 @@
|
|||||||
|
|
||||||
#define JOB_STATUS_FORMAT "[%u] %-22s %.40s\n"
|
#define JOB_STATUS_FORMAT "[%u] %-22s %.40s\n"
|
||||||
|
|
||||||
#define _SPECIAL_VARS_STR "_*@$!?#"
|
#define _SPECIAL_VARS_STR "_*@$!?#-"
|
||||||
#define SPECIAL_VARS_STR ("_*@$!?#" + 1)
|
#define SPECIAL_VARS_STR ("_*@$!?#-" + 1)
|
||||||
#define NUMERIC_SPECVARS_STR ("_*@$!?#" + 3)
|
#define NUMERIC_SPECVARS_STR ("_*@$!?#-" + 3)
|
||||||
#if BASH_PATTERN_SUBST
|
#if BASH_PATTERN_SUBST
|
||||||
/* Support / and // replace ops */
|
/* Support / and // replace ops */
|
||||||
/* Note that // is stored as \ in "encoded" string representation */
|
/* Note that // is stored as \ in "encoded" string representation */
|
||||||
@ -1008,6 +1008,7 @@ struct globals {
|
|||||||
int debug_indent;
|
int debug_indent;
|
||||||
#endif
|
#endif
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
|
char optstring_buf[sizeof("eix")];
|
||||||
#if BASH_EPOCH_VARS
|
#if BASH_EPOCH_VARS
|
||||||
char epoch_buf[sizeof("%lu.nnnnnn") + sizeof(long)*3];
|
char epoch_buf[sizeof("%lu.nnnnnn") + sizeof(long)*3];
|
||||||
#endif
|
#endif
|
||||||
@ -4888,6 +4889,7 @@ static int parse_dollar(o_string *as_string,
|
|||||||
case '#': /* number of args */
|
case '#': /* number of args */
|
||||||
case '*': /* args */
|
case '*': /* args */
|
||||||
case '@': /* args */
|
case '@': /* args */
|
||||||
|
case '-': /* $- option flags set by set builtin or shell options (-i etc) */
|
||||||
goto make_one_char_var;
|
goto make_one_char_var;
|
||||||
case '{': {
|
case '{': {
|
||||||
char len_single_ch;
|
char len_single_ch;
|
||||||
@ -5062,11 +5064,10 @@ static int parse_dollar(o_string *as_string,
|
|||||||
case '_':
|
case '_':
|
||||||
goto make_var;
|
goto make_var;
|
||||||
#if 0
|
#if 0
|
||||||
/* TODO: $_ and $-: */
|
/* TODO: $_: */
|
||||||
/* $_ Shell or shell script name; or last argument of last command
|
/* $_ Shell or shell script name; or last argument of last command
|
||||||
* (if last command wasn't a pipe; if it was, bash sets $_ to "");
|
* (if last command wasn't a pipe; if it was, bash sets $_ to "");
|
||||||
* but in command's env, set to full pathname used to invoke it */
|
* but in command's env, set to full pathname used to invoke it */
|
||||||
/* $- Option flags set by set builtin or shell options (-i etc) */
|
|
||||||
ch = i_getch(input);
|
ch = i_getch(input);
|
||||||
nommu_addchr(as_string, ch);
|
nommu_addchr(as_string, ch);
|
||||||
ch = i_peek_and_eat_bkslash_nl(input);
|
ch = i_peek_and_eat_bkslash_nl(input);
|
||||||
@ -6397,6 +6398,23 @@ static NOINLINE int expand_one_var(o_string *output, int n,
|
|||||||
case '#': /* argc */
|
case '#': /* argc */
|
||||||
val = utoa(G.global_argc ? G.global_argc-1 : 0);
|
val = utoa(G.global_argc ? G.global_argc-1 : 0);
|
||||||
break;
|
break;
|
||||||
|
case '-': { /* active options */
|
||||||
|
/* Check set_mode() to see what option chars we support */
|
||||||
|
char *cp;
|
||||||
|
val = cp = G.optstring_buf;
|
||||||
|
if (G.o_opt[OPT_O_ERREXIT])
|
||||||
|
*cp++ = 'e';
|
||||||
|
if (G_interactive_fd)
|
||||||
|
*cp++ = 'i';
|
||||||
|
if (G_x_mode)
|
||||||
|
*cp++ = 'x';
|
||||||
|
/* If G.o_opt[OPT_O_NOEXEC] is true,
|
||||||
|
* commands read but are not executed,
|
||||||
|
* so $- can not execute too, 'n' is never seen in $-.
|
||||||
|
*/
|
||||||
|
*cp = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
val = get_local_var_value(var);
|
val = get_local_var_value(var);
|
||||||
}
|
}
|
||||||
@ -9899,6 +9917,9 @@ int hush_main(int argc, char **argv)
|
|||||||
/* IFS is not inherited from the parent environment */
|
/* IFS is not inherited from the parent environment */
|
||||||
set_local_var_from_halves("IFS", defifs);
|
set_local_var_from_halves("IFS", defifs);
|
||||||
|
|
||||||
|
if (!get_local_var_value("PATH"))
|
||||||
|
set_local_var_from_halves("PATH", bb_default_root_path);
|
||||||
|
|
||||||
/* PS1/PS2 are set later, if we determine that we are interactive */
|
/* PS1/PS2 are set later, if we determine that we are interactive */
|
||||||
|
|
||||||
/* bash also exports SHLVL and _,
|
/* bash also exports SHLVL and _,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user