【问题标题】:How to make a pipeable bash script如何制作可管道化的 bash 脚本
【发布时间】:2018-06-23 10:25:33
【问题描述】:

我正在开发一个名为 Tools 的 bash 包,我正在尝试制作一个 bash 脚本,您可以通过管道将命令的所有输出传递给 /dev/null。

例子:

cat myfile | null

null 是工具中的命令。

然后它什么也不会输出。我知道如何将输出重定向到 /dev/null 或其他地方,但是,我如何制作一个可管道的脚本来做到这一点。

我当前的占位符代码:

#!/bin/bash
sudo $1 &> /dev/null

执行格式:

null cat\ myfile 

反斜杠是一个转义字符,因此 bash 知道它是一个参数,而不是两个;参数通常用空格分隔

【问题讨论】:

    标签: bash pipe


    【解决方案1】:

    为此工作:

    somecommand | null
    

    您只需要您的 null 脚本包含:

    cat > /dev/null
    

    cat 从标准输入读取并写入标准输出,在这种情况下您已重定向到/dev/null

    请注意,这不会重定向 stderr,因为管道符号 (|) 只会重定向 stdout。您可以使用|& 来重定向stdout 和stderr,如下所示:

    somecommand |& null
    

    不过,真正的问题是,为什么要为此烦恼?您也可以轻松运行:

    somecommand > /dev/null
    

    或者:

    somecommand >& /dev/null
    

    更新

    哇,bash 3.2?那太老了。该版本的 bash 不支持 |& 运算符。你可以像这样完成同样的事情:

    somecommand 2>&1 | null
    

    这就是说“将标准错误重定向到标准输出,然后将标准输出重定向到管道”。

    【讨论】:

    • 好吧,你为什么不能 cat &> /dev/null
    • @PythonDude29 ... 因为管道符号 (|) 只重定向标准输出。
    • “输出到/dev/null”和“省略输出”有什么区别?这些听起来像是我的同义词。
    • 它确实有效,我只是在测试中很糟糕,|& 管道输出:'&' 附近的意外令牌
    • 这表明您实际上并没有使用bash,而是使用了其他类似 Bourne 的 shell。
    【解决方案2】:

    这里有太多无用的猫。你的脚本需要做的就是

    exec >/dev/null
    

    如果你也想核对标准错误,

    exec >/dev/null 2>/dev/null
    

    请注意,没有命令的exec 会将其重定向应用于脚本的其余部分。

    【讨论】:

    • 脚本只有一个输入流。重定向标准错误没有意义。
    • @Kusalananda 没错;让第二个exec 作为示例,在不同用途的脚本中重定向多个文件描述符。
    猜你喜欢
    • 2011-05-24
    • 2016-04-10
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2011-12-17
    • 2012-11-19
    相关资源
    最近更新 更多