为什么这个条件不会中断

时间:2016-09-16 10:24:07

标签: bash

我正在尝试等待我的docker容器启动一些命令。

我正在做以下事情:

#!/bin/bash

DOCKER_IP=192.168.99.100
ES_PORT=9300

docker-compose up -d
while [ -z "$(nc -z $DOCKER_IP $ES_PORT)" ]; do
    sleep 1
done
echo "Do some stuff now it's up !"

我已经与cat -e核实,nc -z的返回为空,没有引号,[ ! -n $(nc ...)]为条件表达式...

nc的返回值不为空时,我在循环中有Connection to 192.168.99.100 port 9300 [tcp/vrace] succeeded!并且它永远不会退出。

为什么这个简单的循环条件不起作用?

1 个答案:

答案 0 :(得分:1)

问题很可能是因为nc在标准错误上打印消息“Connection to 192.168.99.100 port 9300 [tcp/vrace] succeeded!”而不是标准输出(否则你不应该看到它)。您可以重定向标准错误(以便命令替换捕获它),如下所示:

while [ -z "$(nc -z $DOCKER_IP $ES_PORT 2>&1)" ]; do
    sleep 1
done

但是,并非所有版本的nc在连接成功时都打印此消息(我的不是)。那你为什么不简单地使用nc -z的退出状态:

while ! nc -z $DOCKER_IP $ES_PORT
do
    sleep 1
done