hush: Print error messages on shift -1
No binary (build failed)
—
(log yok)
| @@ -1,5 +1,5 @@ | |
| $THIS_SH -c 'shift; echo "$@"' 0 1 2 3 4 | |
| - | #We do abort on -1, but then we abort. bash executes echo. |
| + | # We do complain on -1, but then we abort. bash executes echo. |
| $THIS_SH -c 'shift -1; echo "$@"' 0 1 2 3 4 | |
| $THIS_SH -c 'shift 0; echo "$@"' 0 1 2 3 4 | |
| $THIS_SH -c 'shift 1; echo "$@"' 0 1 2 3 4 | |
| @@ -9377,7 +9377,18 @@ static int FAST_FUNC builtin_shift(char **argv) | |
| int n = 1; | |
| argv = skip_dash_dash(argv); | |
| if (argv[0]) { | |
| - | n = atoi(argv[0]); |
| + | n = bb_strtou(argv[0], NULL, 10); |
| + | if (errno || n < 0) { |
| + | /* shared string with ash.c */ |
| + | bb_error_msg("Illegal number: %s", argv[0]); |
| + | /* |
| + | * ash aborts in this case. |
| + | * bash prints error message and set $? to 1. |
| + | * Interestingly, for "shift 99999" bash does not |
| + | * print error message, but does set $? to 1 |
| + | * (and does no shifting at all). |
| + | */ |
| + | } |
| } | |
| if (n >= 0 && n < G.global_argc) { | |
| if (G_global_args_malloced) { | |
| @@ -0,0 +1,10 @@ | |
| + | 2 3 4 |
| + | hush: Illegal number: -1 |
| + | 1 2 3 4 |
| + | 1 2 3 4 |
| + | 2 3 4 |
| + | 3 4 |
| + | 4 |
| + | |
| + | 1 2 3 4 |
| + | 1 2 3 4 |
| @@ -0,0 +1,10 @@ | |
| + | $THIS_SH -c 'shift; echo "$@"' 0 1 2 3 4 |
| + | #We complain on -1 and continue. |
| + | $THIS_SH -c 'shift -1; echo "$@"' 0 1 2 3 4 |
| + | $THIS_SH -c 'shift 0; echo "$@"' 0 1 2 3 4 |
| + | $THIS_SH -c 'shift 1; echo "$@"' 0 1 2 3 4 |
| + | $THIS_SH -c 'shift 2; echo "$@"' 0 1 2 3 4 |
| + | $THIS_SH -c 'shift 3; echo "$@"' 0 1 2 3 4 |
| + | $THIS_SH -c 'shift 4; echo "$@"' 0 1 2 3 4 |
| + | $THIS_SH -c 'shift 5; echo "$@"' 0 1 2 3 4 |
| + | $THIS_SH -c 'shift 6; echo "$@"' 0 1 2 3 4 |