如何将Docker组成的消息隐藏到stderr?

时间:2019-05-20 16:37:41

标签: bash docker docker-compose

我有一个非常简单的脚本,可以用来等待过程完成。该脚本用于对任务的调用,这些任务取决于过程的完成情况。如果该过程已准备就绪,则将运行所需的命令。格式为:

await_script_while_condition_not_met && cmd2

这意味着await_script_while_condition_not_met将循环运行,直到满足条件且仅在cmd2运行之后。

Docker-compose似乎将消息输出到stderr。在Bash中,> /dev/null重定向stdout而不是stdeer。要将两者都重定向到/dev/null,我必须将stderr重定向到stdout。

#!/usr/bin/env bash

is_npm_install_running () {
    docker-compose run node test -d node_modules/.staging 2>&1 > /dev/null
}

main () {
    while is_npm_install_running; do
        sleep 30
    done
}

main & PID=$!

echo ''
echo ''
echo 'This may take a while, please be patient!'
echo 'Npm install is still running...'
echo ''

while kill -0 $PID 2> /dev/null; do 
    printf  "▓"
    sleep 2
done

echo 'Done!'

2>&1 > /dev/null不会阻止Docker-compose输出初始化消息,您可以在下面的图像屏幕快照Starting docker_XXXX...done!, etc中看到这些消息:

enter image description here

如果过程很长,将会有很多不必要的重复消息,因此我想隐藏。我拥有的脚本非常简单,仅用于await才能完成该过程,然后再允许用户继续运行某些服务,任务或命令:虽然很不错,但并非绝对必要!一种美化工具。

This video demo演示了实际运行中的脚本,并针对案例> /dev/null(请记住我要隐藏的消息存在并在每次迭代中不断增加的情况)进行操作,上面的源代码案例2>&1 > /dev/null的工作方式与此类似。

编辑

这被标记为重复,但是建议的帖子中出现的答案无法像当前消息中所公开的那样起作用;还有as documented here

1 个答案:

答案 0 :(得分:0)

我发现可行的解决方案是2> /dev/null

对于上述情况,应阅读:

docker-compose run node test -d node_modules/.staging 2> /dev/null