xargs: fix -e default to match newer GNU xargs, add SUS mandated -E.
closes bug 4414
This commit is contained in:
		| @@ -355,20 +355,22 @@ enum { | ||||
| 	OPTBIT_UPTO_NUMBER, | ||||
| 	OPTBIT_UPTO_SIZE, | ||||
| 	OPTBIT_EOF_STRING, | ||||
| 	OPTBIT_EOF_STRING1, | ||||
| 	USE_FEATURE_XARGS_SUPPORT_CONFIRMATION(OPTBIT_INTERACTIVE,) | ||||
| 	USE_FEATURE_XARGS_SUPPORT_TERMOPT(     OPTBIT_TERMINATE  ,) | ||||
| 	USE_FEATURE_XARGS_SUPPORT_ZERO_TERM(   OPTBIT_ZEROTERM   ,) | ||||
|  | ||||
| 	OPT_VERBOSE     = 1<<OPTBIT_VERBOSE    , | ||||
| 	OPT_NO_EMPTY    = 1<<OPTBIT_NO_EMPTY   , | ||||
| 	OPT_UPTO_NUMBER = 1<<OPTBIT_UPTO_NUMBER, | ||||
| 	OPT_UPTO_SIZE   = 1<<OPTBIT_UPTO_SIZE  , | ||||
| 	OPT_EOF_STRING  = 1<<OPTBIT_EOF_STRING , | ||||
| 	OPT_INTERACTIVE = USE_FEATURE_XARGS_SUPPORT_CONFIRMATION((1<<OPTBIT_INTERACTIVE)) + 0, | ||||
| 	OPT_TERMINATE   = USE_FEATURE_XARGS_SUPPORT_TERMOPT(     (1<<OPTBIT_TERMINATE  )) + 0, | ||||
| 	OPT_ZEROTERM    = USE_FEATURE_XARGS_SUPPORT_ZERO_TERM(   (1<<OPTBIT_ZEROTERM   )) + 0, | ||||
| 	OPT_VERBOSE     = 1 << OPTBIT_VERBOSE    , | ||||
| 	OPT_NO_EMPTY    = 1 << OPTBIT_NO_EMPTY   , | ||||
| 	OPT_UPTO_NUMBER = 1 << OPTBIT_UPTO_NUMBER, | ||||
| 	OPT_UPTO_SIZE   = 1 << OPTBIT_UPTO_SIZE  , | ||||
| 	OPT_EOF_STRING  = 1 << OPTBIT_EOF_STRING , /* GNU: -e[<param>] */ | ||||
| 	OPT_EOF_STRING1 = 1 << OPTBIT_EOF_STRING1, /* SUS: -E<param> */ | ||||
| 	OPT_INTERACTIVE = USE_FEATURE_XARGS_SUPPORT_CONFIRMATION((1 << OPTBIT_INTERACTIVE)) + 0, | ||||
| 	OPT_TERMINATE   = USE_FEATURE_XARGS_SUPPORT_TERMOPT(     (1 << OPTBIT_TERMINATE  )) + 0, | ||||
| 	OPT_ZEROTERM    = USE_FEATURE_XARGS_SUPPORT_ZERO_TERM(   (1 << OPTBIT_ZEROTERM   )) + 0, | ||||
| }; | ||||
| #define OPTION_STR "+trn:s:e::" \ | ||||
| #define OPTION_STR "+trn:s:e::E:" \ | ||||
| 	USE_FEATURE_XARGS_SUPPORT_CONFIRMATION("p") \ | ||||
| 	USE_FEATURE_XARGS_SUPPORT_TERMOPT(     "x") \ | ||||
| 	USE_FEATURE_XARGS_SUPPORT_ZERO_TERM(   "0") | ||||
| @@ -376,8 +378,6 @@ enum { | ||||
| int xargs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | ||||
| int xargs_main(int argc, char **argv) | ||||
| { | ||||
| 	static const char const_eof_str[] ALIGN1 = "_"; | ||||
|  | ||||
| 	char **args; | ||||
| 	int i, n; | ||||
| 	xlist_t *list = NULL; | ||||
| @@ -387,7 +387,7 @@ int xargs_main(int argc, char **argv) | ||||
| 	int n_max_arg; | ||||
| 	size_t n_chars = 0; | ||||
| 	long orig_arg_max; | ||||
| 	const char *eof_str = const_eof_str; | ||||
| 	const char *eof_str = NULL; | ||||
| 	unsigned opt; | ||||
| 	size_t n_max_chars; | ||||
| #if ENABLE_FEATURE_XARGS_SUPPORT_ZERO_TERM | ||||
| @@ -396,10 +396,12 @@ int xargs_main(int argc, char **argv) | ||||
| #define read_args process_stdin | ||||
| #endif | ||||
|  | ||||
| 	opt = getopt32(argv, OPTION_STR, &max_args, &max_chars, &eof_str); | ||||
| 	opt = getopt32(argv, OPTION_STR, &max_args, &max_chars, &eof_str, &eof_str); | ||||
|  | ||||
| 	/* -e without optional param? */ | ||||
| 	if ((opt & OPT_EOF_STRING) && eof_str == const_eof_str) | ||||
| 	/* -E ""? You may wonder why not just omit -E? | ||||
| 	 * This is used for portability: | ||||
| 	 * old xargs was using "_" as default for -E / -e */ | ||||
| 	if ((opt & OPT_EOF_STRING1) && eof_str[0] == '\0') | ||||
| 		eof_str = NULL; | ||||
|  | ||||
| 	if (opt & OPT_ZEROTERM) | ||||
|   | ||||
| @@ -6,14 +6,24 @@ | ||||
|  | ||||
| # testing "test name" "command" "expected result" "file input" "stdin" | ||||
|  | ||||
| testing "xargs stops on underscore" \ | ||||
| 	"xargs" \ | ||||
| testing "xargs -E _ stops on underscore" \ | ||||
| 	"xargs -E _" \ | ||||
| 	"a\n" \ | ||||
| 	"" "a\n_\nb\n" | ||||
|  | ||||
| testing "xargs -E ''" \ | ||||
| 	"xargs -E ''" \ | ||||
| 	"a _ b\n" \ | ||||
| 	"" "a\n_\nb\n" | ||||
|  | ||||
| testing "xargs -e without param" \ | ||||
| 	"xargs -e" \ | ||||
| 	"a _ b\n" \ | ||||
| 	"" "a\n_\nb\n" | ||||
|  | ||||
| testing "xargs does not stop on underscore ('new' GNU behavior)" \ | ||||
| 	"xargs" \ | ||||
| 	"a _ b\n" \ | ||||
| 	"" "a\n_\nb\n" | ||||
|  | ||||
| exit $FAILCOUNT | ||||
|   | ||||
		Reference in New Issue
	
	Block a user