ash: BASH_XTRACEFD bashism
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 4 Aug 2017 13:24:49 +0000 (15:24 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 4 Aug 2017 13:24:49 +0000 (15:24 +0200)
Based on patch by Johannes Schindelin <johannes.schindelin@gmx.de>

function                                             old     new   delta
evalcommand                                         1447    1500     +53

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index 2ad86c187f72ed22075183e80d8ef8be1309c7a5..e80425f5ee2d1fba468b5c344020f99905f8bd8f 100644 (file)
 #define    BASH_PIPEFAIL        ENABLE_ASH_BASH_COMPAT
 #define    BASH_HOSTNAME_VAR    ENABLE_ASH_BASH_COMPAT
 #define    BASH_SHLVL_VAR       ENABLE_ASH_BASH_COMPAT
+#define    BASH_XTRACEFD        ENABLE_ASH_BASH_COMPAT
 
 #if defined(__ANDROID_API__) && __ANDROID_API__ <= 24
 /* Bionic at least up to version 24 has no glob() */
@@ -9792,6 +9793,15 @@ evalcommand(union node *cmd, int flags)
        expredir(cmd->ncmd.redirect);
        redir_stop = pushredir(cmd->ncmd.redirect);
        preverrout_fd = 2;
+       if (BASH_XTRACEFD && xflag) {
+               /* NB: bash closes fd == $BASH_XTRACEFD when it is changed.
+                * we do not emulate this. We only use its value.
+                */
+               const char *xtracefd = lookupvar("BASH_XTRACEFD");
+               if (xtracefd && is_number(xtracefd))
+                       preverrout_fd = atoi(xtracefd);
+
+       }
        status = redirectsafe(cmd->ncmd.redirect, REDIR_PUSH | REDIR_SAVEFD2);
 
        path = vpath.var_text;