我正在自动化ftp会话,但我想获取stdout并通过管道将其发送到文件。我想出了3个选项:
选项1
ftp -i ftpServer >stdoutFile <<EOF
cd somewhere
get something
EOF
选项2
ftp -i ftpServer <<EOF >stdoutFile
cd somewhere
get something
EOF
选项3
ftp -i ftpServer <<EOF
cd somewhere
get something
EOF > stdoutFile
我似乎发现所有这些都有语法错误,但似乎都不起作用。
我觉得我以前不知怎么做到了,但我不记得是怎么做到的。
编辑
语法错误仍然存在。看起来,如果我在一个名为EOF的here文档中使用这个方法,我就不能在脚本中的任何其他地方使用这个delimeter——这很奇怪。
产生的确切错误实际上是下一个if语句终止时的失败。例如:
if [ condition ]
then
ftp -i ftpServer >stdoutFile <<EOF
cd somewhere
get something
EOF
fi
if [ something else ]
then
somethingWithaHereDoc <<EOF
foo
bar
EOF
fi
我得到Syntax error near unexpected token 'fi'
指向最后一张照片的线。
我这样做的原因是因为我想从ftp服务器下载一个特定的文件。我列出了目录内容,退出ftp会话并在bash中处理它,然后启动另一个ftp会话来获取我选择的文件。
<<EOF
仅发出信号此处文档将从下一行开始。您可以将此重定向与其他重定向自由混合,因此选项1和2都有效。两者之间没有区别,尽管我怀疑大多数人更喜欢并建议选项1,因为它似乎不会将输出重定向"插入"到here文档中。
如果选项1或选项2出现语法错误,那么它们几乎肯定与here文档本身无关。
选项3无效,因为here文档分隔符必须单独出现在一行上,而且它不是原始命令的一部分。
您可能想要引用第一个EOF
。选项3不会终止heredoc,所以这是错误的,但其他选项2应该有效(我通常使用选项2)。您想要ssh
而不是ftp
吗(即,您是试图预处理一个产生输出的操作,还是获取一个文件)?以下是我如何进行ssh:
ssh ... << 'EOF' > file
remote commands here
EOF
也可以通过管道连接到本地进程:
ssh ... << 'EOF' | awk ...
remote commands here
EOF