[英]Why is the order of execution inversed in this bash script?
我有这个脚本:
ssh -T user@$123.456.789.123 <<EOF
cd www
var=$(tail index.htm)
echo $var
EOF
我认为应该做的是:
相反,似乎tail是在更改文件夹之前执行的,因此找不到index.htm文件。
我尝试使用不同的命令,并且每次似乎我尝试存储到变量中的命令替换结果在打开SSH连接后,在执行任何其他脚本之前都立即执行。
我在这里想念什么?
$(...)
在本地扩展,然后将here文档的内容传递给ssh
。 要将文字文本发送到远程服务器,请引用此处文档定界符。
ssh -T user@$123.456.789.123 <<'EOF'
cd www
var=$(tail index.htm)
echo "$var"
EOF
(另外,引用$var
的扩展名以保护外壳程序的任何嵌入式间距。)
tail
在本地计算机上的bash脚本中运行,而不是在远程主机上。 甚至在执行ssh
命令之前都会进行替换。
您的脚本可以简单地替换为:
ssh -T user@$123.456.789.123 tail www/index.htm
如果要将这些命令发送到远程服务器,可以编写
ssh -T user@$123.456.789.123 'cd www && var=$(tail index.htm) && echo $var'
请注意,根据前一个命令的结果限制下一个命令,可使SSH返回有意义的返回码。 在您的Heredoc中,无论发生什么情况(例如, tail
失败),SSH都将以$?= 0返回,因为echo
不会失败。
另一种选择是在此处创建脚本并使用ssh启动它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.