如何使Bash脚本中的输出静音?


149

我有一个程序输出到stdout,并希望在传递到文件时在Bash脚本中使该输出静音。

例如,运行程序将输出:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

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

#!/bin/bash
myprogram > sample.s

我记得,将输出重定向到文件会导致它不会回显到终端。什么不适合您?
Anon。


Answers:


187

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

15
“&>”行是我刚刚发布的内容的简短版本。我以前没有遇到过这种捷径。正在投票。
chradcliffe

5
&>比bash的4大很多
伊格纳西奥巴斯克斯-艾布拉姆斯

@ IgnacioVazquez-Abrams是否可以链接记录变更记录&>的简介?:o
ThorSummoner 2015年

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208表示它>>&是在4.0中引入的。没有提及,&>但是CHANGES仅返回到2.0,所以我认为这已经在1.x中。
6

git blameon redir.c指向1998年提交,但仍在当前代码库中进行最早的提交。
三胞胎

60

将stderr重定向到stdout

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

2>&1

将标准输出重定向到文件

现在,当执行此操作时,您会将标准输出重定向到文件 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

13
最后一个缺少重定向操作符;它应该是myprogram >/dev/null 2>&1(注意/dev/null重定向之前的楔形和重定向顺序)。
6

2
myprogram &>/dev/null不够吗?
JaviOverflow

38

所有输出:

scriptname &>/dev/null

便携式:

scriptname >/dev/null 2>&1

便携式:

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

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

scriptname &>-

这行不通。它实际上创建了一个名为的文件,-并且&>是不可移植的bourne shell扩展。
PhilT 2014年

可移植等效项echo moo 1>&-产生错误,因为文件描述符1已关闭:-bash: echo: write error: Bad file descriptor
Tripleee

11

如果您想同时使用STDOUT和STDERR,那么最简单的方法是:

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

然后像这样运行它./script,您将没有输出到终端。:)

“>”表示STDERR和STDOUT。在&还与管道相同的方式:./script |& sed 将一切发送到SED


7
man bash(在“重定向标准输出和标准错误”下)说&>和>&是等效的,但首选第一个(&>)。但是|&是对管道执行此操作的唯一方法。
约翰·梅勒

1
a 2>&1 | b 2>&1 | c
@John

9

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


2
有趣的骇客...为聪明而赞美^ _ ^
skplunkerin 17-4-25


0

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

要实际关闭回声,命令是:

stty -echo

(例如,这是;当您想要输入密码而又不想让密码可读时。请记住在脚本末尾打开回显,否则运行脚本的人将看不到他的密码。 / she从此开始输入。要在运行中打开echo,请执行以下操作:

时髦回声


0

在脚本中有用:


仅获取文件中的STDERR,同时隐藏任何STDOUT,即使根本不存在要隐藏的程序(也不会挂起父脚本),仅此一项就有效:

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

完全分离并使所有内容静音,即使杀死父脚本也不会中止./prog

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.