【发布时间】:2017-05-19 02:56:46
【问题描述】:
我对 Bash 的 Heredoc 构造行为深感困惑。
这是我正在做的事情:
#!/bin/bash
user="some_user"
server="some_server"
address="$user"@"$server"
printf -v user_q '%q' "$user"
function run {
ssh "$address" /bin/bash "$@"
}
run << SSHCONNECTION1
sudo dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed" > /home/$user_q/check.txt
softwareInstalled=$(cat /home/$user_q/check.txt)
SSHCONNECTION1
我得到的是
cat: /home/some_user/check.txt: 没有这样的文件或目录
这很奇怪,因为如果我要使用 SSH 连接并检查以下路径,则该文件存在。
我做错了什么?文件不可执行,只是一个文本文件。 谢谢。
【问题讨论】:
-
$(cat ...)命令在本地运行。 -
顺便说一句,请注意我在您之前的问题中链接到的替代答案(使用
printf '%q ' "$@"生成一个 argv 列表,在命令行上将其传递给您的远程 shell,然后引用它的项目$1、$2等;这是它避免的场景之一。 -
...尽管需要注意的是远程
/bin/sh需要能够解析printf '%q'生成的内容,如果它不是 bash 或 ksh 并且您有不寻常的字符,这可能是一个问题在你的论点中。 -
另外,
softwareInstalled只存在于远程服务器上;定义它没有什么意义,然后在远程脚本中什么也不做。 -
@chepner 我没有显示整个脚本,该变量稍后使用。谢谢