我试图想出一个方法脚本来在 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 行不起作用,但它们给出了我想要的想法:一种将 command1command2 的输出定向到屏幕或 /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/

10-12 07:21
查看更多