我已经为我写了一个脚本来运行一些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
假设重定向是参数,并决定打印出命令的用法。
这是一个关于标准描述符(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