我正在自动执行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的文档一起使用,我就不能在脚本中的任何其他位置使用该范围 - 很奇怪。
产生的确切错误实际上是下一个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连接现在挂起。我使用〜/ .bashrc文件,它在另一个控制台中工作,但不在脚本中。我不小心在目录中有一个命名管道,导致ftp会话挂起。一切都现在解决了。谢谢!
我这样做的原因是因为我想从ftp服务器下载特定文件。我列出目录内容,退出ftp会话并在bash中处理它,然后启动另一个ftp会话以获取我选择的文件。
答案 0 :(得分:4)
仅<<EOF
信号,此处文档将在下一行开始。您可以将其与其他重定向自由混合,因此选项1和2都有效。两者之间没有区别,虽然我怀疑大多数人会更喜欢并建议选项1,因为它似乎没有“插入”输出重定向到这里的文档。
如果您使用选项1或选项2获得语法错误,则它们几乎肯定与此文档本身无关。
选项3无效,因为此处的文档分隔符必须单独出现在一行上,并且因为它不是原始命令的一部分。
答案 1 :(得分:0)
您可能想引用第一个EOF
。选项3不会终止heredoc,所以它是错误的,但其他2应该工作(我通常使用选项2)。您想要ssh
而不是ftp
(即,您是否尝试执行产生输出或抓取文件的操作)?下面是我做ssh的方式:
ssh ... << 'EOF' > file
remote commands here
EOF
也可以管道到本地进程:
ssh ... << 'EOF' | awk ...
remote commands here
EOF