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

问题描述 投票:0回答:10

每当我不想看到程序的输出时,键入此内容真的很烦人。我很想知道是否有更短的写法:

$ program >/dev/null 2>&1

通用 shell 是最好的,但了解其他 shell 也会很有趣,尤其是 bash 或 dash。

bash shell command redirect pipe
10个回答
16
投票
>& /dev/null

15
投票

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

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

13
投票

bashzshdash 中:

$ program >&- 2>&-

它也可能出现在其他 shell 中工作,因为

&-
是一个错误的文件描述符。

请注意,此解决方案会关闭文件描述符,而不是将它们重定向到

/dev/null
,这可能会导致程序中止。


7
投票

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

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

然后我只需输入

program no

3
投票

编辑:基于

(:)
|:
的解决方案可能会导致错误,因为
:
不读取
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 的评论。


2
投票

如果

/dev/null
太多而无法输入,您可以(作为 root)执行以下操作:

ln -s /dev/null /n

那么你可以这样做:

program >/n 2>&1

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


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

1
投票

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
并选择性或全局禁用调试输出。


0
投票

在我看来,最便携的解决方案和最佳答案是您的终端(PC)上的宏。

这样,无论你登录到哪个服务器,它都会一直在那里。

如果您碰巧运行 Windows,您可以通过 AHK(google 一下,它是开源的)在两行小代码中获得所需的结果。它可以将任何键字符串原位转换为任何其他键字符串。

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

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


0
投票

这不是最有效的解决方案,但我只是将所有计算机上的 dev/null 链接到 /dev/0,习惯了它并且节省了一些时间。

© www.soinside.com 2019 - 2024. All rights reserved.