每当我不想看到程序的输出时,输入这个真的很烦人。我很想知道是否有更短的写法:
$ program >/dev/null 2>&1
通用 shell 是最好的,但其他 shell 也会很有趣,尤其是 bash 或 dash。
>& /dev/null
您可以为此编写一个函数:
function nullify() {
"$@" >/dev/null 2>&1
}
要使用此功能:
nullify program arg1 arg2 ...
当然,您可以随意命名该函数。例如,它可以是单个字符。
顺便说一句,您可以使用exec
重定向stdout
和stderr
临时/dev/null
。我不知道这对你的情况是否有帮助,但我想分享它。
# Save stdout, stderr to file descriptors 6, 7 respectively.
exec 6>&1 7>&2
# Redirect stdout, stderr to /dev/null
exec 1>/dev/null 2>/dev/null
# Run program.
program arg1 arg2 ...
# Restore stdout, stderr.
exec 1>&6 2>&7
在bash、zsh和dash 中:
$ program >&- 2>&-
它也可能在其他 shell 中工作,因为&-
它是一个错误的文件描述符。
请注意,此解决方案会关闭文件描述符而不是将它们重定向到/dev/null
,这可能会导致程序中止。
大多数 shell 支持别名。例如,在我的 .zshrc 中,我有如下内容:
alias -g no='2> /dev/null > /dev/null'
然后我只输入
program no
如果/dev/null
输入太多,您可以(以 root 身份)执行以下操作:
ln -s /dev/null /n
然后你可以这样做:
program >/n 2>&1
但是,当然,如果不先设置该符号链接,您以这种方式编写的脚本将无法移植到其他系统。
还值得注意的是,通常重定向输出并不是真正需要的。许多 Unix 和 Linux 程序接受一个“静默标志”,通常是-n
or -q
,它禁止任何输出并且只在成功或失败时返回一个值。
例如
grep foo bar.txt >/dev/null 2>&1
if [ $? -eq 0 ]; then
do_something
fi
可以改写为
grep -q foo bar.txt
if [ $? -eq 0 ]; then
do_something
fi
编辑:基于(:)
or|:
的解决方案可能会导致错误,因为:
不读取stdin
. 尽管它可能不如关闭文件描述符那么糟糕,正如 Zaz 的回答中所建议的那样。
对于 bash 和 bash 兼容的 shell (zsh...):
$ program &>/dev/null
OR
$ program &> >(:) # Should actually cause error or abortion
对于所有贝壳:
$ program 2>&1 >/dev/null
OR
$ program 2>&1|: # Should actually cause error or abortion
$ program 2>&1 > >(:)
不适用于dash,因为它拒绝操作文件替换的进程替换权。
说明:
2>&1
将 stderr(文件描述符 2)重定向到 stdout(文件描述符 1)。|
是标准输出到另一个命令的标准输入的常规管道。:
是一个不做任何事情的内置 shell(它相当于true
)。&>
将 stdout 和 stderr 输出重定向到文件。>(your-command)
是过程替代。它被替换为特殊文件的路径,例如:/proc/self/fd/6
. 该文件用作命令的输入文件your-command
。注意:尝试写入已关闭文件描述符的进程将收到EBADF
(错误文件描述符)错误,这比尝试写入| true
. 后者会导致EPIPE
(管道)错误,请参阅 Charles Duffy 的评论。
Ayman Hourieh 的解决方案适用于一次性调用过于健谈的程序。但是,如果您想要抑制输出的只有一小部分通常调用的程序,请考虑通过将以下内容添加到您的.bashrc
文件(或等效项,如果您使用另一个 shell)来使它们静音:
CHATTY_PROGRAMS=(okular firefox libreoffice kwrite)
for PROGRAM in "${CHATTY_PROGRAMS[@]}"
do
printf -v eval_str '%q() { command %q "$@" &>/dev/null; }' "$PROGRAM" "$PROGRAM"
eval "$eval_str"
done
这样,您可以继续使用它们通常的名称调用程序,但它们的 stdout 和 stderr 输出将消失在位桶中。
另请注意,某些程序允许您配置它们发出多少日志记录/调试输出。对于 KDE 应用程序,您可以运行kdebugdialog
并有选择地或全局禁用调试输出。
在我看来,最便携的解决方案和最佳答案将是您终端(PC)上的宏。
这样,无论您登录到哪个服务器,它都会一直存在。
如果您碰巧运行 Windows,您可以通过 AHK(谷歌搜索,它是开源的)在两行代码中获得所需的结果。这可以将任何一串键原位转换为任何其他键串。
您键入“ugly.sh >>NULL”,它会将其重写为“ugly.sh 2>&1 > /dev/null”或其他内容。
其他平台的解决方案要困难一些。AppleScript 可以粘贴到键盘按下,但不能那么容易触发。