jdo*_*dle 5 shell stdout stderr io-redirection docker
我已经编写了一个脚本来为我运行一些 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
假设重定向是参数并决定打印出命令用法。
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)