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