hush: fix bug 207 and "hush -c" parameter passing.
Now hush -c 'printf "%s\n" "$@"' (prints "\n") and hush -c 'printf "%s\n" "$@"' qwe asd (prints "asd\n") both work correctly
This commit is contained in:
parent
5368ad53e9
commit
a8b6dff97f
14
shell/hush.c
14
shell/hush.c
@ -1219,8 +1219,13 @@ static int o_glob(o_string *o, int n)
|
||||
* Otherwise, just finish current list[] and start new */
|
||||
static int o_save_ptr(o_string *o, int n)
|
||||
{
|
||||
if (o->o_glob)
|
||||
return o_glob(o, n); /* o_save_ptr_helper is inside */
|
||||
if (o->o_glob) { /* if globbing is requested */
|
||||
/* If o->has_empty_slot, list[n] was already globbed
|
||||
* (if it was requested back then when it was filled)
|
||||
* so don't do that again! */
|
||||
if (!o->has_empty_slot)
|
||||
return o_glob(o, n); /* o_save_ptr_helper is inside */
|
||||
}
|
||||
return o_save_ptr_helper(o, n);
|
||||
}
|
||||
|
||||
@ -4285,6 +4290,11 @@ int hush_main(int argc, char **argv)
|
||||
switch (opt) {
|
||||
case 'c':
|
||||
G.global_argv = argv + optind;
|
||||
if (!argv[optind]) {
|
||||
/* -c 'script' (no params): prevent empty $0 */
|
||||
*--G.global_argv = argv[0];
|
||||
optind--;
|
||||
} /* else -c 'script' PAR0 PAR1: $0 is PAR0 */
|
||||
G.global_argc = argc - optind;
|
||||
opt = parse_and_run_string(optarg, 0 /* parse_flag */);
|
||||
goto final_return;
|
||||
|
@ -1,2 +1,3 @@
|
||||
Should be printed
|
||||
Should be printed
|
||||
Empty:
|
||||
|
@ -12,3 +12,6 @@ for a in "$@"""; do echo Should not be printed; done
|
||||
for a in """$@"; do echo Should not be printed; done
|
||||
for a in """$@"''"$@"''; do echo Should not be printed; done
|
||||
for a in ""; do echo Should be printed; done
|
||||
|
||||
# Bug 207: "$@" expands to nothing, and we erroneously glob "%s\\n" twice:
|
||||
printf "Empty:%s\\n" "$@"
|
||||
|
Loading…
Reference in New Issue
Block a user