Bash将输出分配给此处文档中的变量

时间:2016-03-27 17:14:15

标签: linux bash ssh heredoc

bash脚本中,我需要的是ssh到服务器并执行一些命令,到目前为止我得到的是这样的:

outPut="ss"
ssh user@$serverAddress << EOF
cd /opt/logs
outPut="$(ls -l)"
echo 'output is ' $outPut
EOF
echo "${outPut}"

但终端的输出是:

output is  ss
ss

output被分配给命令ls -l的输出,但它显示的仍然是原始值ss。这有什么不对?

2 个答案:

答案 0 :(得分:4)

这里实际上有两个不同的问题。首先,在here-document内部,在将文档发送到命令之前,shell会对变量引用和命令替换进行评估。因此,$(ls -l)$outPut在被发送(通过ssh)到远程计算机之前在本地计算机上进行评估。您可以通过转义$(以及可能的某些其他字符,例如您希望发送到远端的转义)或通过将here-doc分隔符括在引号(ssh user@$serverAddress << "EOF")中来避免这种情况这会为文档关闭该功能。

其次,远程计算机上发生的变量分配保留在远程计算机上。本地和远程shell无法共享状态。如果您需要来自远程计算机的信息,则需要将其作为输出从脚本的远程部分发回,并捕获该输出(使用remoteOutput=$(ssh ...)ssh ... >"$tempFile"之类的内容)。如果要发回多个值,则脚本的远程部分必须以本地部分可以解析它的方式格式化其输出。另外,请注意远程部分的任何其他输出(包括错误消息)都会混入,因此您必须仔细解析才能获得所需的值。

答案 1 :(得分:1)

不,抱歉这不起作用。

  1. 在here-doc中使用命令替换值(to printf)(EOF之间的行):

    ssh user@$serverAddress << EOF
        printf 'output is %s\n' "$(ls -l /opt/logs)"
    EOF
    
  2. 或者从ssh中捕获命令的执行,然后使用值。

    outPut="$( 
        ssh user@$serverAddress << EOF
            cd /opt/logs
            ls -l
    EOF
    )"
    echo 'output is ' "$outPut"
    echo "${outPut}"
    
  3. 选项1看起来更清晰。