我试图想出一个方法脚本来在 bash 中传递一个无声标志,以便所有输出都将被定向到 /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/