是否有“> / dev / null 2>& 1”的命令行快捷方式

时间:2009-05-30 00:51:58

标签: bash shell command redirect pipe

每当我不想看到程序的输出时输入它真的很烦人。我想知道是否有更短的写作方式:

$ program >/dev/null 2>&1

通用shell是最好的,但其他shell也很有趣,特别是bash或dash。

9 个答案:

答案 0 :(得分:15)

您可以为此编写一个函数:

function nullify() {
  "$@" >/dev/null 2>&1
}

使用此功能:

nullify program arg1 arg2 ...

当然,您可以根据需要为该功能命名。例如,它可以是单个字符。

顺便说一句,您可以使用exec暂时将stdoutstderr重定向到/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

答案 1 :(得分:14)

>& /dev/null

答案 2 :(得分:9)

bash zsh 破折号

$ program >&- 2>&-

它可能出现在其他shell中工作,因为&-是一个错误的文件描述符。

请注意,此解决方案会关闭文件描述符,而不是将其重定向到/dev/null,这可能会导致程序中止。

答案 3 :(得分:6)

大多数shell支持别名。例如,在我的.zshrc中,我有类似的东西:

alias -g no='2> /dev/null > /dev/null' 

然后我输入

program no

答案 4 :(得分:2)

如果/dev/null输入太多,您可以(以root身份)执行以下操作:

ln -s /dev/null /n

然后你可以这样做:

program >/n 2>&1

但是,当然,如果不首先设置该符号链接,以这种方式编写的脚本将无法移植到其他系统。

答案 5 :(得分:2)

值得注意的是,通常不需要重定向输出。许多Unix和Linux程序接受一个"静默标记",通常是-n-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

答案 6 :(得分:2)

修改:基于(:)|:的解决方案可能会导致错误,因为:无法读取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 > >(:)不适用于破折号,因为它拒绝操作文件替换的进程替换权。

说明:

  • 2>&1将stderr(文件描述符2)重定向到stdout(文件描述符1)。
  • |是stdout到另一个命令的stdin的常规管道。
  • :是一个内置的shell,它什么都不做(它相当于true)。
  • &>将stdout和stderr输出重定向到文件。
  • >(your-command)是流程替换。它将替换为特殊文件的路径,例如:/proc/self/fd/6。此文件用作命令your-command的输入文件。

注意:尝试写入已关闭文件描述符的进程将收到EBADF(错误的文件描述符)错误,这比尝试写入| true更容易导致中止。后者会导致EPIPE(管道)错误,请参阅Charles Duffy的评论。

答案 7 :(得分:1)

Ayman Hourieh's solution适用于过度聊天程序的一次性调用。但是,如果只有一小部分通常被称为要抑制输出的程序,请考虑通过将以下内容添加到.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并有选择地或全局禁用调试输出。

答案 8 :(得分:0)

对我而言,最便携的解决方案和最佳答案将是终端(PC)上的宏。

这样,无论您登录的服务器是什么,它都会一直存在。

如果你碰巧运行Windows,你可以用两行微小的代码来获得AHK(google it,它的开源)所需的结果。这可以将任意键串转换为任意其他键,原位。

您输入“ugly.sh>> NULL”,它会将其重写为“ugly.sh 2>& 1> / dev / null”或其他内容。

其他平台的解决方案有点困难。 AppleScript可以粘贴键盘按键,但不能轻易触发。