Bash set +x without it being printed

后端 未结 5 1288
轻奢々
轻奢々 2020-12-07 11:56

Does anyone know if we can say set +x in bash without it being printed:

set -x
command
set +x

traces

+ command         


        
相关标签:
5条回答
  • 2020-12-07 12:28

    This is a combination of a few ideas that can enclose a block of code and preserves the exit status.

    #!/bin/bash
    shopt -s expand_aliases
    alias trace_on='set -x'
    alias trace_off='{ PREV_STATUS=$? ; set +x; } 2>/dev/null; (exit $PREV_STATUS)'
    
    trace_on
    echo hello
    trace_off
    echo "status: $?"
    
    trace_on
    (exit 56)
    trace_off
    echo "status: $?"
    

    When executed:

    $ ./test.sh 
    + echo hello
    hello
    status: 0
    + exit 56
    status: 56
    
    0 讨论(0)
  • 2020-12-07 12:30

    I hacked up a solution to this just recently when I became annoyed with it:

    shopt -s expand_aliases
    _xtrace() {
        case $1 in
            on) set -x ;;
            off) set +x ;;
        esac
    }
    alias xtrace='{ _xtrace $(cat); } 2>/dev/null <<<'
    

    This allows you to enable and disable xtrace as in the following, where I'm logging how the arguments are assigned to variables:

    xtrace on
    ARG1=$1
    ARG2=$2
    xtrace off
    

    And you get output that looks like:

    $ ./script.sh one two
    + ARG1=one
    + ARG2=two
    
    0 讨论(0)
  • 2020-12-07 12:33

    I had the same problem, and I was able to find a solution that doesn't use a subshell:

    set -x
    command
    { set +x; } 2>/dev/null
    
    0 讨论(0)
  • 2020-12-07 12:37

    You can use a subshell. Upon exiting the subshell, the setting to x will be lost:

    ( set -x ; command )
    
    0 讨论(0)
  • 2020-12-07 12:37

    How about a solution based on a simplified version of @user108471:

    shopt -s expand_aliases
    alias trace_on='set -x'
    alias trace_off='{ set +x; } 2>/dev/null'
    
    trace_on
    ...stuff...
    trace_off
    
    0 讨论(0)
提交回复
热议问题