Readlink 无法通过 ssh 工作

Readlink 无法通过 ssh 工作

我正在尝试使用 通过 SSH 发送 bash 命令ssh -q $REMOTE -x "command"。因为我有多个 bash 命令,所以我使用<< EOF

问题是,当我将 readlink 命令的结果赋给变量时,它返回一个空字符串。而当我直接调用它时,它不会返回空字符串。

这是我的代码的简化版本:

ssh -q $REMOTE -x << EOF
    LINK="/path/to/my/link" # the link points to /path/to/my/file
    readlink $LINK # outputs /path/to/my/file
    TEST=$(readlink -f "$LINK")
    echo $TEST # outputs an empty string
EOF

此时,我将相同的代码放入远程计算机上的 shell 脚本中,并尝试调用该 shell 脚本:

# local machine
ssh -q $REMOTE -x << EOF
    ./test-script
EOF
# remote machine "test-script"
LINK="/path/to/my/link" # the link points to /path/to/my/file
readlink $LINK # outputs /path/to/my/file
TEST=$(readlink -f "$LINK")
echo $TEST # outputs /path/to/my/file

突然它就开始工作了,当我调用远程脚本时,一切都正常工作,但是为什么它不能通过 ssh 工作呢?

答案1

在 here document 中,您的变量在源端进行求值。如果您希望变量在目标端进行求值,请转义 $。例如,

ssh -q $REMOTE -x << EOF
    LINK="/path/to/my/link"
    readlink \$LINK
    TEST=\$(readlink -f "\$LINK")
    echo \$TEST
EOF

希望这可以帮助

答案2

Bash 参考手册

here-documents 的格式为:

[n]<<[-]word
        here-document
delimiter

如果任何部分单词被引用,分隔符是删除引号的结果单词,并且此处文档中的行不会被扩展。如果单词不加引号,此处文档的所有行都将经过参数扩展、命令替换和算术扩展,字符序列\newline将被忽略,并且\必须使用引号字符\$`

因此要么逃跑$(比如另一个答案说)或使用<< "EOF"(带引号);否则像$variable和这样的语法$(…)将在本地解析。

相关内容