【问题标题】:How to silence output from docker commands如何使 docker 命令的输出静音
【发布时间】:2021-05-09 04:24:09
【问题描述】:
我已经编写了一个脚本来为我运行一些 docker 命令,并且我想使这些命令的输出静音。例如docker load、docker run 或docker 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 假定重定向是参数并决定打印出命令用法。
【问题讨论】:
标签:
docker
shell
stdout
stderr
io-redirection
【解决方案1】:
这主要是关于标准描述符(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 必须放在之后这一事实就变得清晰了。
(顺便说一句,将两个标准错误重定向到标准输出到管道有点不同,并且将按以下顺序编写: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