使用内联&lt; <eof ... =“”eof时,我在哪里管道传输文件?

时间:2016-07-28 15:14:22

标签: bash scripting

=“”

我正在自动执行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会话以获取我选择的文件。

2 个答案:

答案 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