diff --git a/xargs.1 b/xargs.1 index 9313c67..c8b6669 100644 --- a/xargs.1 +++ b/xargs.1 @@ -4,8 +4,10 @@ xargs \- constuct argument list(s) and execute command .SH SYNOPSIS .B xargs .RB [ \-r ] +.RB [ \-E +.IR eofstr ] .RI [ cmd -.RI [arg... ] ] +.IR [arg... ] ] .SH DESCRIPTION xargs reads space, tab, newline and EOF delimited strings from stdin and executes the specified cmd with the strings as arguments. @@ -26,6 +28,9 @@ newlines, may be escaped by a backslash. .BI \-r Do not run the command if there are no arguments. Normally the command is executed at least once even if there are no arguments. +.TP +.B \-E eofstr +Use eofstr as a logical EOF marker. .SH EXIT STATUS xargs exits with one of the following values: diff --git a/xargs.c b/xargs.c index 1eb9bff..b77c90f 100644 --- a/xargs.c +++ b/xargs.c @@ -27,12 +27,13 @@ static char *argb; static size_t argbsz = 1; static size_t argbpos; static int nerrors = 0; +static char *eofstr; static int rflag = 0; static void usage(void) { - eprintf("usage: %s [-r] [cmd [arg...]]\n", argv0); + eprintf("usage: %s [-r] [-E eofstr] [cmd [arg...]]\n", argv0); } int @@ -46,6 +47,9 @@ main(int argc, char *argv[]) case 'r': rflag = 1; break; + case 'E': + eofstr = EARGF(usage()); + break; default: usage(); } ARGEND; @@ -186,9 +190,8 @@ poparg(void) while ((ch = inputc()) != EOF) { switch (ch) { case ' ': case '\t': case '\n': - fillbuf('\0'); deinputc(ch); - return argb; + goto out; case '\'': if (parsequote('\'') == -1) enprintf(EXIT_FAILURE, @@ -209,8 +212,11 @@ poparg(void) break; } } +out: if (argbpos > 0) { fillbuf('\0'); + if (eofstr && strcmp(argb, eofstr) == 0) + return NULL; return argb; } return NULL;