将变量作为参数传递给heredoc块内的docker-compose命令时,变量不会扩展

时间:2018-10-07 18:54:07

标签: bash shell docker unix docker-compose

我试图使用bash脚本在ssh上运行一些docker-compose命令,如下所示。我的意思是我有一个可执行的Shell脚本deploy.sh,其中包含以下代码段

ssh -tt -o StrictHostKeyChecking=no root@142.32.45.2 << EOF
DIR=test
echo \${DIR}
docker-compose --project-name \${DIR} up -d
EOF

但是DIR变量在作为参数传递给docker-compose时不会扩展。它执行如下。 echo \${DIR}给出正确的输出,即 test

docker-compose --project-name ${DIR} up -d

1 个答案:

答案 0 :(得分:0)

ssh -tt -o StrictHostKeyChecking=no root@142.32.45.2 <<'EOF'
DIR=test
echo ${DIR}
docker-compose --project-name ${DIR} up -d
EOF

摆脱\ $-它阻止了变量的扩展。但是在第二次审核中,我看到的是您的意图。如果要防止所有变量扩展,直到代码在远程主机上执行,请尝试将Heredoc词放在引号中。这样,$将传递到传递给ssh的脚本。

作为第二个建议(根据下面的评论),我考虑将参数化脚本发送到远程主机,然后执行它(更改其权限之后)。

# Make script
cat >compose.sh <<'EOF'
#!/bin/bash
DIR=$1
docker-compose --project-name $DIR
EOF

scp -o StrictHostKeyChecking=no compose.sh root@142.32.45.2: 
ssh -o StrictHostKeyChecking=no root@142.32.45.2 chmod +x ./compose.sh \; ./compose.sh test