summary refs log tree commit diff
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2015-12-10 17:17:41 +0100
committerChristian Neukirchen <chneukirchen@gmail.com>2015-12-10 17:17:41 +0100
commit6b6e018595d005cc39a31251831db804fd974d9a (patch)
treeaf2f7056e4ba8c4a7dc106bad4027a7d353a2411
parent1575f68ee189304c8a158786e979f5e5cde3a20a (diff)
downloadxe-6b6e018595d005cc39a31251831db804fd974d9a.tar.gz
xe-6b6e018595d005cc39a31251831db804fd974d9a.tar.xz
xe-6b6e018595d005cc39a31251831db804fd974d9a.zip
-v prints commands to stderr
-rw-r--r--README.md2
-rw-r--r--xe.c19
2 files changed, 12 insertions, 9 deletions
diff --git a/README.md b/README.md
index f876629..6710479 100644
--- a/README.md
+++ b/README.md
@@ -30,7 +30,7 @@ Over apply:
 * `-R`: return with status 122 when no arguments have been passed.
 * `-k`: keep going: don't stop when a command failed to execute.
 * `-n`: don't run the commands, just print them.
-* `-v`: print commands before running them.
+* `-v`: print commands to standard error before running them.
 * `-I`: replace occurences of *arg* with the argument (default: `{}`).
 * `-N`: pass upto *maxargs* arguments to each COMMAND (default: 1).
   `-N0` will pass as many arguments as possible.
diff --git a/xe.c b/xe.c
index 42ca3b9..af6495a 100644
--- a/xe.c
+++ b/xe.c
@@ -30,6 +30,7 @@ static int maxjobs = 1;
 static int runjobs = 0;
 static int Rflag, Aflag, aflag, kflag, nflag, vflag;
 static long iterations = 0;
+static FILE *traceout;
 
 static size_t argmax;
 static int push_overflowed;
@@ -108,17 +109,17 @@ shquote(const char *s)
 	                "\021\022\023\024\025\026\027\030"
 	                "\031\032\033\034\035\036\037\040"
 	                "`^#*[]=|\\?${}()'\"<>&;\127")) {
-		printf("%s", s);
+		fprintf(traceout, "%s", s);
 		return;
 	}
 
-	putchar('\'');
+	fprintf(traceout, "\'");
 	for (; *s; s++)
 		if (*s == '\'')
-			printf("'\\''");
+			fprintf(traceout, "'\\''");
 		else
-			putchar(*s);
-	putchar('\'');
+			fprintf(traceout, "%c", *s);
+	fprintf(traceout, "\'");
 }
 
 static int
@@ -128,10 +129,10 @@ trace()
 
 	for (i = 0; i < argslen; i++) {
 		if (i > 0)
-			printf(" ");
+			fprintf(traceout, " ");
 		shquote(args[i]);
 	}
-	printf("\n");
+	fprintf(traceout, "\n");
 
 	return 0;
 }
@@ -244,6 +245,8 @@ main(int argc, char *argv[])
 	if (argmax <= 0)
 		argmax = _POSIX_ARG_MAX;
 
+	traceout = stdout;
+
 	while ((c = getopt(argc, argv, "+0A:I:N:Raj:kns:v")) != -1)
 		switch(c) {
 		case '0': delim = '\0'; break;
@@ -256,7 +259,7 @@ main(int argc, char *argv[])
 		case 'k': kflag++; break;
 		case 'n': nflag++; break;
 		case 's': sflag = optarg; break;
-		case 'v': vflag++; break;
+		case 'v': vflag++; traceout = stderr; break;
 		default:
 			fprintf(stderr, 
 			    "Usage: %s [-0Rknv] [-I arg] [-N maxargs] [-j maxjobs] COMMAND...\n"