【问题标题】:How to silence output in a Bash script?如何使 Bash 脚本中的输出静音?
【发布时间】:2011-01-18 13:38:48
【问题描述】:

我有一个输出到标准输出的程序,并且想在管道到文件时在 Bash 脚本中使该输出静音。

例如运行程序会输出:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

我希望以下脚本不向终端输出任何内容:

#!/bin/bash
myprogram > sample.s

【问题讨论】:

标签: bash


【解决方案1】:

如果它也输出到 stderr,你会想要让它静音。您可以通过重定向文件描述符 2 来做到这一点:

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null

【讨论】:

  • “&>”行是我刚刚发布的内容的较短版本。我以前没有遇到过那个快捷方式。点赞。
  • &> 比 bash 4 早很多。
  • @IgnacioVazquez-Abrams 您能否链接记录&>s 介绍的更改日志? :o
  • git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 表示 >>& 是在 4.0 中引入的。没有提到&>,但更改只会回到 2.0,所以我认为这意味着它已经在 1.x 中。
  • git blame on redir.c 指向 1998 年提交的仍然在当前代码库中的最旧事件。
【解决方案2】:

将标准错误重定向到标准输出

这会将stderr(即描述符2)重定向到文件描述符1,即stdout。

2>&1

将标准输出重定向到文件

现在执行此操作时,您会将标准输出重定向到文件sample.s

myprogram > sample.s

将标准错误和标准输出重定向到文件

结合这两个命令将导致 stderr 和 stdout 都重定向到 sample.s

myprogram > sample.s 2>&1

将 stderr 和 stdout 重定向到 /dev/null

如果您想完全静默您的应用程序,请重定向到 /dev/null

myprogram >/dev/null 2>&1

【讨论】:

  • 最后一个缺少重定向操作符;它应该是myprogram >/dev/null 2>&1(注意/dev/null 之前的楔形和重定向的顺序)。
  • myprogram &>/dev/null 不够吗?
【解决方案3】:

如果你想要 STDOUT 和 STDERR 都 [everything],那么最简单的方法是:

#!/bin/bash
myprogram >& sample.s

然后像./script 一样运行它,你的终端不会有任何输出。 :)

“&”表示 STDERR 和 STDOUT。 & 也同样适用于管道:./script |& sed 这会将所有内容发送到 sed

【讨论】:

  • man bash(在“重定向标准输出和标准错误”下)说 &> 和 >& 是等效的,但首选第一个 (&>)。但是 |& 是对管道执行此操作的唯一方法。
  • @John 不,管道的便携方式是a 2>&1 | b 2>&1 | c
【解决方案4】:

所有输出:

scriptname &>/dev/null

便携:

scriptname >/dev/null 2>&1

便携:

scriptname >/dev/null 2>/dev/null

对于较新的 bash(不可移植):

scriptname &>-

【讨论】:

  • 这不起作用。它实际上创建了一个名为 - 的文件,而 &> 是一个不可移植的 bourne shell 扩展。
  • 便携式等效 echo moo 1>&- 产生错误,因为文件描述符 1 已关闭:-bash: echo: write error: Bad file descriptor
【解决方案5】:

尝试:

myprogram &>/dev/null

没有输出

【讨论】:

    【解决方案6】:

    如果您仍在努力寻找答案,特别是如果您为输出生成了一个文件,并且您更喜欢明确的替代方案: echo "hi" | grep "use this hack to hide the oputut :) "

    【讨论】:

    • 有趣的 hack... 为聪明点赞 ^_^
    【解决方案7】:

    注意:此答案与“如何在执行 shell 脚本 Linux 时关闭回显”问题相关,该问题又被标记为与此重复。

    要真正关闭回显,命令是:

    stty -echo

    (例如,当您想输入密码并且不希望它可读时。请记住在脚本末尾打开回显,否则运行脚本的人不会看看他/她从那时起输入了什么。打开 echo on run:

    stty 回声

    【讨论】:

      【解决方案8】:

      有用的变体:


      • 仅获取文件中的 STDERR,同时隐藏任何 STDOUT,即使 隐藏的程序根本不存在。 (永远不会挂起):

        stty -echo && ./programMightNotExist 2> errors.log && stty echo
        

      • 完全分离并沉默一切,甚至杀死父母 脚本不会中止./prog(行为就像nohup):

        ./prog </dev/null >/dev/null 2>&1 &
        

      • nohup也可以用来完全分离,如下:

        nohup ./prog &
        

        将在脚本旁边创建一个日志文件nohup.out,使用tail -f nohup.out 读取它。

      【讨论】:

        【解决方案9】:

        仅在错误时输出

        so [命令]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-20
          • 1970-01-01
          • 2015-03-10
          • 1970-01-01
          • 2015-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多