仅当上一个命令至少有一个结果时,如何执行管道中的下一个命令?

仅当上一个命令至少有一个结果时,如何执行管道中的下一个命令?

所以,我有以下命令

$(docker container ls -a -q) | docker container stop

停止我所有的 docker 容器,效果很好!除非我刚刚清除了所有容器:

"docker container stop" requires at least 1 argument.
See 'docker container stop --help'.

Usage:  docker container stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers

有什么方法可以防止使用单行命令显示此错误消息?

注意:我原来的命令实际上是docker container stop $(docker container ls -a -q),它给出了相同的错误消息,但我认为使用管道/链接一个命令到另一个命令来描述我的问题会更容易。这两个命令的答案都可以,但我更喜欢使用docker container stop $(docker container ls -a -q)

答案1

由于 Docker 的 N 元停止操作对于零个容器来说是愚蠢的,因此您可以将其视为docker stop container仅需要一个参数的一元操作,并对该一元操作进行自己的术语列表分配。当然,您的逻辑可以这样处理空术语序列:

for x in $(docker container ls -a -q); do docker container stop $x; done

如果$(docker ...)没有产生任何结果,则循环不会执行。

答案2

您可以使用重定向来静默 shell 输出,请参阅此文章了解更多详细信息:https://stackoverflow.com/questions/2292847/how-to-silence-output-in-a-bash-script

我可能会使用更像这样的东西来处理响应,这样我仍然可以获得输出。

docker container stop $(docker container ls -a -q) >/dev/null 2>&1 || echo "Nothing to stop."

相关内容