如何使 docker 命令的输出静音

jdo*_*dle 5 shell stdout stderr io-redirection docker

我已经编写了一个脚本来为我运行一些 docker 命令,我想静默这些命令的输出。例如docker load,docker 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假设重定向是参数并决定打印出命令用法。

Eri*_*kMD 13

这主要是关于标准描述符(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
Run Code Online (Sandbox Code Playgroud)