xargs: restore correct behaviour of -n option
Since commit 1ff7002b1
(xargs: fix handling of quoted arguments, closes
11441) the -n option hasn't worked properly:
$ echo 1 2 3 | xargs -n 1 echo
1
2
3
$
Because state is now remembered between calls to process_stdin() it's
necessary to update the state before any premature return.
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
ed8af51b60
commit
1c462d47a0
@ -315,6 +315,7 @@ static char* FAST_FUNC process_stdin(int n_max_chars, int n_max_arg, char *buf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (state == SPACE) { /* word's delimiter or EOF detected */
|
if (state == SPACE) { /* word's delimiter or EOF detected */
|
||||||
|
state = NORM;
|
||||||
if (q) {
|
if (q) {
|
||||||
bb_error_msg_and_die("unmatched %s quote",
|
bb_error_msg_and_die("unmatched %s quote",
|
||||||
q == '\'' ? "single" : "double");
|
q == '\'' ? "single" : "double");
|
||||||
@ -335,7 +336,6 @@ static char* FAST_FUNC process_stdin(int n_max_chars, int n_max_arg, char *buf)
|
|||||||
if (n_max_arg == 0) {
|
if (n_max_arg == 0) {
|
||||||
goto ret;
|
goto ret;
|
||||||
}
|
}
|
||||||
state = NORM;
|
|
||||||
}
|
}
|
||||||
if (p == buf) {
|
if (p == buf) {
|
||||||
goto ret;
|
goto ret;
|
||||||
|
@ -48,6 +48,17 @@ testing "xargs argument line too long" \
|
|||||||
"seq 10000 99999 | sed -e 's/^/\"/' -e 's/$/\"/' | xargs echo | grep -o 99999; echo \$?" \
|
"seq 10000 99999 | sed -e 's/^/\"/' -e 's/$/\"/' | xargs echo | grep -o 99999; echo \$?" \
|
||||||
"99999\n0\n" \
|
"99999\n0\n" \
|
||||||
"" ""
|
"" ""
|
||||||
|
|
||||||
|
testing "xargs -n1" \
|
||||||
|
"xargs -n1 echo" \
|
||||||
|
"1\n2\n3\n4\n5\n" \
|
||||||
|
"" "1 2 3 4 5\n"
|
||||||
|
|
||||||
|
testing "xargs -n2" \
|
||||||
|
"xargs -n2 echo" \
|
||||||
|
"1 2\n3 4\n5\n" \
|
||||||
|
"" "1 2 3 4 5\n"
|
||||||
|
|
||||||
SKIP=
|
SKIP=
|
||||||
|
|
||||||
exit $FAILCOUNT
|
exit $FAILCOUNT
|
||||||
|
Loading…
Reference in New Issue
Block a user