Bash代码应该在它之前执行

时间:2013-12-09 22:51:56

标签: linux bash shell

我通过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或更多的行数。

3 个答案:

答案 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