我正在尝试想出一个方法脚本来在 bash 中传递一个 silent 标志,这样所有的输出都将被定向到 /dev/null
如果它存在,如果不存在则显示在屏幕上。
我的脚本的 MWE 是:
#!/bin/bash
# Check if silent flag is on.
if [ $2 = "-s" ]; then
echo "Silent mode."
# Non-working line.
out_var = "to screen"
else
echo $1
# Non-working line.
out_var = "/dev/null"
fi
command1 > out_var
command2 > out_var
echo "End."
我用两个变量调用脚本,第一个是无关紧要的,第二个 ($2
) 是实际的静默标志 (-s
):
./myscript.sh first_variable -s
显然 out_var
行不起作用,但它们给出了我想要的想法:一种引导 command1
和 command2< 输出的方法
到屏幕或 /dev/null
取决于 -s
是否存在。
我该怎么做?
最佳答案
您可以使用裸exec
命令重定向当前程序,而无需启动新程序。
因此,-s
标志可以用类似这样的方式处理:
if [[ "$1" == "-s" ]] ; then
exec >/dev/null 2>&1
fi
下面的完整脚本展示了如何做到这一点:
#!/bin/bash
echo XYZZY
if [[ "$1" == "-s" ]] ; then
exec >/dev/null 2>&1
fi
echo PLUGH
如果你用 -s
运行它,你会得到 XYZZY
但没有 PLUGH
输出(好吧,从技术上讲,你 得到 PLUGH
输出,但它被发送到 /dev/null
位桶)。
如果你在没有 -s
的情况下运行它,你会得到这两行。
echo
语句之前和之后的语句表明 exec
的行为如描述的那样,只是更改当前程序的重定向,而不是尝试重新执行它。
顺便说一句,我假设你的意思是“到屏幕”是“到当前标准输出”,它可能是也可能不是实际的终端设备(例如,如果它已经被重定向到其他地方)。如果您确实想要实际的终端设备,它仍然可以完成(例如使用 /dev/tty
),但这将是一个不寻常的要求。
关于Bash:根据标志重定向到屏幕或/dev/null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25635071/