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.schinde...@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
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to