[PATCH] ash: support BASH_XTRACEFD when built Bash compatibly

Johannes Schindelin johannes.schindelin at gmx.de
Fri Aug 4 10:58:21 UTC 2017


There is a very useful feature in Bash where you can redirect the trace
enabled by `set -x` to a file descriptor *different* than 2. This comes
in particularly handy when validating the error output of commands, say,
in Git's test suite, while tracing at the same time.

It is such a useful feature, and very easily implemented.

Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
---
 shell/ash.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/shell/ash.c b/shell/ash.c
index 8c9f4adc6..1d1596fec 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -182,6 +182,8 @@
 #define IF_BASH_PATTERN_SUBST       IF_ASH_BASH_COMPAT
 #define    BASH_SUBSTR          ENABLE_ASH_BASH_COMPAT
 #define IF_BASH_SUBSTR              IF_ASH_BASH_COMPAT
+#define    BASH_XTRACEFD        ENABLE_ASH_BASH_COMPAT
+#define IF_BASH_XTRACEFD            IF_ASH_BASH_COMPAT
 /* [[ EXPR ]] */
 #define    BASH_TEST2           (ENABLE_ASH_BASH_COMPAT * ENABLE_ASH_TEST)
 #define    BASH_SOURCE          ENABLE_ASH_BASH_COMPAT
@@ -9740,6 +9742,7 @@ evalcommand(union node *cmd, int flags)
 	int status;
 	char **nargv;
 	smallint cmd_is_exec;
+	IF_BASH_XTRACEFD(const char *xtracefd;)
 
 	/* First expand the arguments. */
 	TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags));
@@ -9791,6 +9794,10 @@ evalcommand(union node *cmd, int flags)
 
 	expredir(cmd->ncmd.redirect);
 	redir_stop = pushredir(cmd->ncmd.redirect);
+#ifdef BASH_XTRACEFD
+	xtracefd = lookupvar("BASH_XTRACEFD");
+	if (!xtracefd || (preverrout_fd = atoi(xtracefd)) < 0)
+#endif
 	preverrout_fd = 2;
 	status = redirectsafe(cmd->ncmd.redirect, REDIR_PUSH | REDIR_SAVEFD2);
 

base-commit: 4dc86699b57ff35c287ca396d562ec206776694a
-- 
2.13.3.windows.1.1055.g9b9ea5f2d78

Published-As: https://github.com/dscho/busybox-w32/releases/tag/busybox-xtracefd-v1
Fetch-It-Via: git fetch https://github.com/dscho/busybox-w32 busybox-xtracefd-v1


More information about the busybox mailing list