我有一个输出到 stdout 的程序,希望在通过管道传输到文件时在 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(标准输出)。
2>&1
现在,在执行此操作时,您正在将标准输出重定向到文件 sample.s
sample.s
myprogram > sample.s
结合这两个命令将导致将 stderr 和 stdout 重定向到 sample.s
myprogram > sample.s 2>&1
如果要使应用程序完全静默,请重定向到 /dev/null。
/dev/null
myprogram >/dev/null 2>&1
如果您同时想要 STDOUT 和 STDERR [所有东西] ,那么最简单的方法是:
#!/bin/bash myprogram >& sample.s
然后像 ./script那样运行它,您将不会得到任何输出到您的终端。 :)
./script
“ > &”表示 STDERR 和 STDOUT。 &也以同样的方式工作于管道: ./script |& sed 会把所有东西都发给 Sed
&
./script |& 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:)”
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
nohup
./prog </dev/null >/dev/null 2>&1 &
nohup 也可用于完全分离,如下所示:
nohup ./prog &
在脚本之外创建一个日志文件 nohup.out,使用 tail -f nohup.out读取它。
nohup.out
tail -f nohup.out
输出 只有错误:
所以 [命令]