Bash 根据变量的状态重定向命令的输出

Bash 根据变量的状态重定向命令的输出,bash,stdout,io-redirection,stderr,Bash,Stdout,Io Redirection,Stderr,我在bash脚本中有许多命令,它们使用>/dev/null 2>&1将stdout和stderr重定向到/dev/null 假设我有一个名为echoOn的变量,它可以是0或1 如果echoOn等于0,那么我希望保留脚本中命令的重定向。如果它等于1,那么我不希望重定向到位,因此命令可以输出 我不希望抑制所有命令的输出,只希望抑制脚本中特定命令的输出 有没有一种更抽象的方法来实现这一点,而无需手动将if语句添加到每个有问题的命令中 我愿意使用一个函数,在其中传递命令及其参数,并用对上述函数的调用和要

我在bash脚本中有许多命令,它们使用>/dev/null 2>&1将stdout和stderr重定向到/dev/null

假设我有一个名为echoOn的变量,它可以是0或1

如果echoOn等于0,那么我希望保留脚本中命令的重定向。如果它等于1,那么我不希望重定向到位,因此命令可以输出

我不希望抑制所有命令的输出,只希望抑制脚本中特定命令的输出

有没有一种更抽象的方法来实现这一点,而无需手动将if语句添加到每个有问题的命令中


我愿意使用一个函数,在其中传递命令及其参数,并用对上述函数的调用和要执行的命令替换每个命令。

我不确定是否正确理解您的要求,但是:

# put the lines below at the beginning of the script
if (( echoOn == 0 )); then
    exec 3>/dev/null 2>&3
else
    exec 3>&1
fi

# then execute your commands
echo foo >&3    # a command which wants to switch the redirection
echo warn >&2   # simulates an error
echo bar        # a command which does not need the switch
如果echoOn设置为0,则终端上仅显示条形图

问题是您需要修改代码,将所有>/dev/null 2>&1表达式替换为>&3

[更新]

为了控制特定命令上的stdout和stderr,请尝试以下操作:

echoOn=0        # set to "1" to ebable stdout/stderr else set to "0"
if (( echoOn == 0 )); then
    exec 3>/dev/null
    exec 4>/dev/null
else
    exec 3>&1
    exec 4>&2
fi

echo foo 1>&3 2>&4          # a command which wants to switch the redirection
(echo warn >&2) 1>&3 2>&4   # simulates an error
echo bar                    # a command which does not need the switch
(echo error >&2)            # simulates anerror
请将1>&3 2>&4添加到要控制其输出的命令中

尝试以下操作:

if [ $# -ge 1 -a $1 -eq 0 ]; then
    exec 3>/dev/null 1>&3 2>&3
else
    exec 3>&1
fi

foo="hello"
warn="world"
bar="stackoverflow"


# then execute your commands
echo $foo >&3    # a command which wants to switch the redirection
echo $warn >&2   # simulates an error
echo $bar        # a command which does not need the switch
我在bash脚本中有许多命令,它们使用>/dev/null 2>&1将stdout和stderr重定向到/dev/null

不使用$获取变量的值。我认为如果您尝试运行脚本,可能会出错。您需要重定向stdout和stderr。因此,如果将参数0传递给脚本,则我的脚本将两者重定向到/dev/null,否则它不会重定向

运行时没有输出。/example.sh 0

输出/示例1


一种不太抽象的方式:0 exec{myout}>/dev/null{myerr}>&$myout;中的case$echoOn;;1 exec{myout}>&1{myerr}>&2;;以撒;echo stuff 1>&$myout 2>&$myerr为什么不创建一个变量,当您想要抑制输出时设置为/dev/null,当您不想抑制输出时设置为/dev/stdout?@ruakh这是我没有想到的另一个可行选项。不过,我会创建两个变量:一个用于stdout,另一个用于stderr。这正是我想要的。非常感谢。如果我想同时显示echo warn>&2,该怎么办?如果您将echoOn设置为非零值,也会显示warn>&2。很抱歉我的误解。我已经更新了我的答案。我希望这就是你想要的。谢谢你的反馈。很好,通过这次讨论,我们彼此都有了更好的了解。抱歉打扰你很多次了。BR.在echoOn==0中,$是可选的,因为是算术上下文。EchoFoo呢?这不是算术上下文,并且$是必需的。您必须编写echo$foo。在echo$foo+bar中,不需要美元。
hello
world
stackoverflow