【问题标题】:Why can't redirect tee command's stdout into /dev/null为什么不能将 tee 命令标准输出重定向到 /dev/null
【发布时间】:2018-11-16 09:57:14
【问题描述】:

我以这种方式为/var/www/html中的所有文件制作指纹。

find /var/www/html  -type  f |xargs md5sum | tee /opt/figerprint.db.ori  

效果很好。

现在我想将 tee 命令的所有标准输出重定向到 /dev/null。

find /var/www/html  -type  f |xargs md5sum | tee /opt/figerprint.db.ori  1>/dev/null

md5sum: /var/www/html/news/uploads/Red: No such file or directory
md5sum: Hat: No such file or directory
md5sum: Enterprise: No such file or directory
md5sum: Linux: No such file or directory
md5sum: 6.txt: No such file or directory

我发现无法正确解析文件名。

ls /var/www/html/news/uploads/Red*
/var/www/html/news/uploads/Red Hat Enterprise Linux 6.txt

如何修复我的命令以正确地将标准输出重定向到 /dev/null?

【问题讨论】:

    标签: bash redirect


    【解决方案1】:

    您的标准输出重定向工作正常,并且与您收到的错误消息无关(无论如何,这是标准错误,而不是标准输出。如果您想丢弃标准错误,那就是2>/dev/null)。

    错误的原因是您将不带引号的文件名传递给md5sum。 GNU find 的一个常见解决方法是使用零字节终止符而不是换行符:

    find /var/www/html -type f -print0 | 
    xargs -0 md5sum |
    tee /opt/figerprint.db.ori >/dev/null
    

    当然,如果您丢弃标准输出,则无需 tee 任何内容。

    find /var/www/html -type  f -print0 | 
    xargs -0 md5sum >/opt/figerprint.db.ori
    

    一个常见的添加是xargs -r,以防止md5sumfind 找不到任何文件时运行。

    错误消息表明您可能没有拥有 GNU find。完成同样事情的另一种方法是

    find /var/www/html -type f -exec md5sum {} + >/opt/figerprint.db.ori
    

    如果您的find 真的很古老并且不支持-exec ... +,您将需要切换到

    find /var/www/html -type f -exec md5sum {} \; >/opt/figerprint.db.ori
    

    然而这将是相当低效的,因为它为每个找到的文件创建一个进程。

    【讨论】:

      【解决方案2】:

      尝试这样做:

      find /var/www/html -type  f | xargs -i md5sum | tee /opt/figerprint.db.ori  1>/dev/null
      

      来自xargs的手册:

      -I 替换-str

      将初始参数中出现的 replace-str 替换为从标准输入中读取的名称。此外,未加引号的空格不会终止输入项;相反,分隔符是换行符。暗示 -x 和 -L 1.

      【讨论】:

        【解决方案3】:

        为什么find /var/www/html -type f |xargs md5sum | tee /opt/figerprint.db.ori 不能显示错误信息?

        find /var/www/html  -type  f |xargs md5sum
        md5sum: /var/www/html/news/uploads/Red: No such file or directory
        md5sum: Hat: No such file or directory
        md5sum: Enterprise: No such file or directory
        md5sum: Linux: No such file or directory
        md5sum: 6.txt: No such file or directory
        

        tee 将在屏幕上同时显示标准输出和标准错误,但默认只写入标准输出信息。

        find /var/www/html  -type  f |xargs md5sum | tee /opt/figerprint.db.ori
        

        我在屏幕上浏览上述命令的输出,

        md5sum: /var/www/html/news/uploads/Red: No such file or directory
        md5sum: Hat: No such file or directory
        md5sum: Enterprise: No such file or directory
        md5sum: Linux: No such file or directory
        md5sum: 6.txt: No such file or directory
        

        以上行(称为相关错误信息)被许多其他行包围,例如

        b61b25303be0f573a6b9446d5cbe3a5b  /var/www/html/index.php
        

        相关错误信息默认不能写入文件(tee的字符)。

        find /var/www/html -type f |xargs md5sum | tee /opt/figerprint.db.ori 永远无法正常工作。

        【讨论】:

          猜你喜欢
          • 2012-08-15
          • 1970-01-01
          • 1970-01-01
          • 2017-11-29
          • 1970-01-01
          • 2012-01-15
          • 2017-03-31
          • 2023-04-08
          • 2012-01-04
          相关资源
          最近更新 更多