如何在 Bash 脚本中静音输出?

问题描述 投票:0回答:9

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

例如运行程序会输出:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

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

#!/bin/bash
myprogram > sample.s
bash
9个回答
228
投票

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

94
投票

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

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

2>&1

将标准输出重定向到文件

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

sample.s

myprogram > sample.s

将 stderr 和 stdout 重定向到文件

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

myprogram > sample.s 2>&1

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

如果您想完全静默您的应用程序,请重定向至

/dev/null

myprogram >/dev/null 2>&1

54
投票

以下仅适用于

bash
(
/bin/bash
) 或类似的(如
zsh
),不适用于
sh
(
/bin/sh
)。

所有输出:

scriptname &>/dev/null

便携式:

scriptname >/dev/null 2>&1

便携式:

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

15
投票

如果您仍在努力寻找答案,特别是如果您为输出生成了一个文件,并且您更喜欢一个明确的替代方案:


echo "hi" | grep "use this hack to hide the oputut :) "


12
投票

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

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

然后像

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

“>&”表示 STDERR 和 STDOUT。

&
对于管道也有同样的作用:
./script |& sed
这会将所有内容发送到 sed


6
投票

尝试:

myprogram &>/dev/null

没有输出


2
投票

有用的变化:


  • 仅获取文件中的 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
    来读取它。


0
投票

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

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

stty-回声

(例如,当您想要输入密码但不希望其可读时。请记住在脚本末尾打开回显,否则运行脚本的人将看不到什么他/她从那时起开始输入。要在运行时打开回显:

stty回声


0
投票

用于输出仅在错误时

所以 [命令]

© www.soinside.com 2019 - 2024. All rights reserved.