如何捕获docker compose exec命令输出并存入bash变量
错误原因
你之前的写法中,&&是Bash层面的命令连接符,会让Shell把rs.status().myState当做宿主机上的独立命令解析,不会传入容器内的Mongo Shell执行,最终触发JS侧的赋值语法错误。
正确实现方案
你原本验证可用的管道写法本身是对的,只需要把整个管道逻辑放到$()命令替换块中即可。建议给mongo命令追加--quiet参数,屏蔽默认的连接欢迎语、版本提示等冗余输出,保证变量存储的结果干净:
MY_STATE=$(cat <<END | docker-compose exec -T mongodb1 mongo --username root --password passwd --quiet rs.status().myState END )
如果只需要执行单条JS语句,还有更简洁的写法,直接用Mongo Shell自带的--eval参数传入要执行的JS代码,不需要写here-document:
MY_STATE=$(docker-compose exec -T mongodb1 mongo --username root --password passwd --quiet --eval "rs.status().myState")
执行完成后可以通过如下命令校验结果:
echo $MY_STATE
正常会返回副本集节点对应的状态码:1代表主节点,2代表从节点,其他值对应异常、选举中等状态。
内容的提问来源于stack exchange,提问作者Ted
相关产品推荐
相关产品推荐

