如何使 docker 命令的输出静音

How to silence output from docker commands

我已经为 运行 一些 docker 命令编写了一个脚本,我想使这些命令的输出静音。例如 docker loaddocker rundocker stop.

docker load 确实有一个标志 --quiet 似乎它应该做我想做的但是当我尝试使用它时它仍然打印出 Loaded image: myimage。即使这个标志对我有用,也不是所有 docker 命令都可以使用这个标志。我曾尝试使用 docker run ... 2>&1 /dev/null 之类的重定向,但是重定向参数被解释为 docker 容器的命令参数,这似乎与其他 docker 命令相同,例如 tar -Oxf myimage.img.tgz | docker load 2>&1 /dev/null 假设重定向是参数并决定打印出命令用法。

这主要是一个关于标准描述符(stdout、stderr)和重定向的 shell 问题。

为了达到你想要的效果,你不应该写cmd 2>&1 /dev/null也不应该写cmd 2>&1 >/dev/null而只写:cmd >/dev/null 2>&1

助记词:

很容易想到这个>语法的直觉是:

  • >/dev/null可读为:STDOUT := /dev/null
  • 2>&1可读为:STDERR := STDOUT

这样一来,2>&1 必须放在 之后 的事实就清楚了。

(顺便说一句,将 stderr 和 stdout 都重定向到管道有点不同,将按以下顺序编写:cmd1 2>&1 | cmd2

用于测试的最小完整示例:

$ cmd() { echo "stdout"; echo >&2 "stderr"; }

$ cmd 2>&1 >/dev/null  # does no work as intended
stderr

$ cmd >/dev/null 2>&1  # ok