Bash:根据标志重定向到屏幕或/dev/null

标签 bash dev-null

我正在尝试想出一个方法脚本来在 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 行不起作用,但它们给出了我想要的想法:一种引导 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/

相关文章:

python - Bash重定向编码错误

regex - 在 sed 中插入换行符 (Mac OS X)

dos - 1>/dev/null 在 DOS 中相当于什么?

c - 即使我将输出重定向到/dev/null,printf 仍然会产生成本吗?

arrays - 在 Bash 中,如何将数字列表转换为数字范围?

linux - Linux控制台中的模糊文件搜索

在 for 循环中 Bash 任意 glob 模式(带空格)

ruby - 重新打开STDOUT到/dev/null时指定文件模式有什么意义?

bash - 如何将所有输出重定向到/dev/null?

node.js - 在 Windows 上使用 NUL dir 搞乱了我的 Git