当使用内联<<EOF..EOF

  • 本文关键字:EOF 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的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连接现在挂起。我使用的是~/.bashrc文件,它可以在另一个控制台中使用,但不能在脚本中使用我不小心在目录中有一个命名管道,导致ftp会话挂起。现在一切都解决了。谢谢

我这样做的原因是因为我想从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

相关内容

最新更新