如何在 Bash 脚本中禁止输出?

我有一个输出到 stdout 的程序,希望在通过管道传输到文件时在 Bash 脚本中静默该输出。

例如,运行程序将输出:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

我希望下面的脚本不要输出任何东西到终端:

#!/bin/bash
myprogram > sample.s
263738 次浏览

如果它也输出到 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

将 stderr 重定向到 stdout

这将把 stderr (描述符2)重定向到文件描述符1(标准输出)。

2>&1

将 stdout 重定向到 File

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

myprogram > sample.s

将 stderr 和 stdout 重定向到 File

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

myprogram > sample.s 2>&1

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

如果要使应用程序完全静默,请重定向到 /dev/null

myprogram >/dev/null 2>&1

如果您同时想要 STDOUT 和 STDERR [所有东西] ,那么最简单的方法是:

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

然后像 ./script那样运行它,您将不会得到任何输出到您的终端。 :)

“ > &”表示 STDERR 和 STDOUT。 &也以同样的方式工作于管道: ./script |& sed 会把所有东西都发给 Sed

所有输出:

scriptname &>/dev/null

便携式:

scriptname >/dev/null 2>&1

便携式:

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

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

scriptname &>-

试试:

myprogram &>/dev/null

没有输出

如果你仍然在努力寻找答案,特别是如果你为输出产生了一个文件,你更喜欢一个明确的选择: Echo“ hi”| grep“ use this hack to hide the output:)”

注意: 这个答案与“如何在执行 shell 脚本 Linux 时关闭 echo”这个问题有关,而这个问题又被标记为与这个脚本重复。

要实际关闭 echo,命令是:

Stty-Echo

(这是,例如,当你想输入一个密码,你不希望它是可读的。记住在脚本的末尾打开 echo,否则运行脚本的人将看不到他/她从那时起输入的内容。让 echo 奔跑:

Stty Echo

有用的变化:


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

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

  • 彻底分离,让一切安静下来,甚至杀死父母 Script 不会中止 ./prog(其行为与 nohup一样) :

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

  • nohup 也可用于完全分离,如下所示:

    nohup ./prog &
    

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

输出 只有错误:

所以 [命令]

Logo