如何将命令执行包装在函数中以允许执行或打印命令;重定向问题

如何将命令执行包装在函数中以允许执行或打印命令;重定向问题

我编写了一些执行大量外部命令的 BASH 代码(导致副作用)。因此,为了开发和调试,我想将执行包装在 shell 函数中,以便执行或打印命令。

所以基本代码是:

run()
{
    if [ "$print_commands" -ne 0 ]; then
        echo "$@"
    else
        "$@"
    fi
}

不幸的是,大多数外部命令在成功时会输出一些内容(例如“成功”),因此我一直在使用> /dev/null重定向此类输出。然而,有一些状态查询输出状态,并且不能丢弃。

所以显然我不能添加到> /dev/null里面run;我也不想添加第二个重定向函数,从而重复大多数代码。

我尝试了这样的解决方案:

silence='>/dev/null'
run some_command with params $silence

silence这个想法是在打印命令时设置为空字符串,这是有效的,但是在执行命令时我得到:

错误:无法识别的参数:>/dev/null

是否有一些不使用的半途优雅解决方案eval

答案1

为什么不检查函数中的另一个变量run并使用它来确定重定向?

run()
{
    if [ "$print_commands" -ne 0 ]; then
        echo "$@"
    elif [ "$silence" -ne 0 ]; then
        "$@" > /dev/null
    else
        "$@"
    fi
}

然后:

silence=1 run some_command with params whose output is not needed
silence=0 run some_command with params whose output is needed

或者您可以将命令输出到 stderr 而不是 stdout:

run()
{
    if [ "$print_commands" -ne 0 ]; then
        echo "$@" >&2
    else
        "$@"
    fi
}

答案2

基于https://unix.stackexchange.com/a/726123/320598我决定添加一个额外的第一个参数来run控制重定向到/dev/null

run()
{
    declare silence="$1"; shift
    if [ "$print_commands" -ne 0 ]; then
        echo "$@"
    elif [ "$silence" -ne 0 ]; then
        "$@" > /dev/null
    else
        "$@"
    fi
}

run 0 non_redirected_command params
run 1 redirected_command params

相关内容