我通过ssh在远程服务器上运行一些代码,但是当我尝试执行代码保存到变量'APP'时,它将在安装文件之前运行,并且在本地计算机而不是远程计算机上执行。我做错了什么?
ssh $TARGET_USER@$TARGET_IP << EOF
if [ ${PACKAGE: -4} == ".dmg" ]; then
hdiutil attach -mountpoint $MOUNTPOINT $FILE_STORE$PACKAGE
APP=`sudo find $MOUNTPOINT -maxdepth 2 -name \*.app | wc -l | tr -d ' '`
fi
EOF
这是我的代码的缩减版本,我希望变量APP包含0或1或更多的行数。
答案 0 :(得分:2)
我完全不明白你想要什么,但大多数问题都归因于<< EOF
部分:
你本地 shell在之前对之前的东西做了某些扩展,结果被发送到执行它的远程端。这会影响$VAR
内容和反引号。
如果您使用<< 'EOF'
,则不会进行本地替换。
如果 - 另一方面 - 你希望替换反引号的变量bot 而不是,那么请使用:
... << EOF
...
APP=\$(sudo ...)
EOF
答案 1 :(得分:1)
shell在将其发送到ssh命令之前在反引号中执行命令。
答案 2 :(得分:1)
引用heredoc标签将阻止扩展。
这是更简单的形式,显示了差异:
cat << EOF
foo=`echo foo`
EOF
产量
foo=foo
VS
cat << "EOF"
foo=`echo foo`
EOF
产量
foo=`echo foo`
有很多例子here