如何解决bash变量似乎无法分配给在容器中执行的psql输出
我让Postgres运行在远程主机上的docker容器中。我正在尝试SSH到该远程主机,并使用Heredoc将脚本传递给该Shell。在该脚本中,我尝试对驻留在该主机上的容器中的postgres数据库执行psql查询,并将输出分配给变量。对不起,我知道这有点令人费解,但是也许某些代码会更一致(也不会)
如果运行此命令,我不会从$ dbVersion的“ echo”中得到任何信息……实际上,由于其他一些实验,我相当确信它根本不会到达“ echo”行,但是对于我的一生,我不知道为什么,因为...
ssh root@$serverIP13 <<EOF
postgresId=\$(docker ps | grep 'postgres_db' | awk '{print \$1}')
dbVersion=\$(docker exec -i \$postgresId psql -X -A -d myDb -U myUser -t -c "SELECT Max(Version) FROM DbVersion;")
echo \$dbVersion
EOF
...以这种方式扭转代码之后,...终于找到了一种可行的方式,并且成功获得了版本号的“回声”。我对bash还是很陌生,所以我希望外面的人能为我辨别出这个奥秘,并帮助我更好地了解bash在这方面的工作原理,以及为什么成功以下而失败的原因。
ssh root@$serverIP13 <<EOF
postgresId=\$(docker ps | grep 'postgres_db' | awk '{print \$1}')
dbVersion=\$(echo "psql -X -A -d myDb -U myUser -t -c 'SELECT Max(Version) FROM DbVersion;'" | docker exec -i \$postgresId bash)
echo \$dbVersion
EOF
解决方法
获取docker exec -i输出的正常方法是要求docker运行shell(反过来,shell运行命令。
参见“ Bash / Docker exec: file redirection from inside a container”(我在2015年提到)
dbVersion=\$(docker exec -i sh -c '\$postgresId psql -X -A -d myDb -U myUser -t -c "SELECT Max(Version) FROM DbVersion;"')
,
以下脚本无需调用bash即可工作:
ssh root@$serverIP13 << 'EOF'
postgresId=$(docker ps | grep 'postgres_db' | awk '{print $1}')
dbVersion=$(docker exec $postgresId psql -X -A -d postgres -U postgres -c "select current_database()")
echo $dbVersion
EOF
我使用'EOF'
以避免逃脱。
要将本地值传递到远程:
ssh root@$serverIP13 /bin/bash -s 1 2 3 << 'EOF'
echo $1 $2 $3
EOF
如果将-i
放在docker exec
中,则不应使用$(...)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。