我有一个输出到标准输出的程序,并且希望在通过管道传输到文件时使 Bash 脚本中的输出静音。
例如运行程序会输出:
% myprogram
% WELCOME TO MY PROGRAM
% Done.
我希望以下脚本不向终端输出任何内容:
#!/bin/bash
myprogram > sample.s
如果它也输出到 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(描述符 2)重定向到文件描述符 1(即 stdout)。
2>&1
现在执行此操作时,您将标准输出重定向到文件
sample.s
myprogram > sample.s
组合这两个命令将导致将 stderr 和 stdout 重定向到sample.s
myprogram > sample.s 2>&1
如果您想完全静默您的应用程序,请重定向至
/dev/null
。
myprogram >/dev/null 2>&1
以下仅适用于
(bash
) 或类似的(如/bin/bash
),不适用于zsh
(sh
)。/bin/sh
所有输出:
scriptname &>/dev/null
便携式:
scriptname >/dev/null 2>&1
便携式:
scriptname >/dev/null 2>/dev/null
如果您仍在努力寻找答案,特别是如果您为输出生成了一个文件,并且您更喜欢一个明确的替代方案:
echo "hi" | grep "use this hack to hide the oputut :) "
如果你想要 STDOUT 和 STDERR [一切],那么最简单的方法是:
#!/bin/bash
myprogram >& sample.s
然后像
./script
一样运行它,你的终端将不会有任何输出。 :)
“>&”表示 STDERR 和 STDOUT。
&
对于管道也有同样的作用:./script |& sed
这会将所有内容发送到 sed
尝试:
myprogram &>/dev/null
没有输出
仅获取文件中的 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
来读取它。
注意:此答案与“如何在执行 shell 脚本 Linux 时关闭回显”问题相关,该问题又被标记为与此重复。
要真正关闭回显,命令是:
stty-回声
(例如,当您想要输入密码但不希望其可读时。请记住在脚本末尾打开回显,否则运行脚本的人将看不到什么他/她从那时起开始输入。要在运行时打开回显:
stty回声