2016-07-28 50 views
1

我正在自动执行一个ftp会话,但我想要把stdout和管道文件。我想出了3个选项:使用内联<< EOF ... EOF时,我在哪里进行管道归档?

选项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'指向最后fi的行。

FTP连接现在挂起。我正在使用〜/ .bashrc文件,它在另一个控制台中工作,但不在脚本中。我不小心在目录中有一个命名管道,导致ftp会话挂起。现在全部解决。谢谢!

我这样做的原因是因为我想从ftp服务器上下载特定的文件。我列出目录内容,退出ftp会话并以bash处理它,然后启动另一个ftp会话来获取我选择的文件。

+2

选项1和2都应该工作。 –

+2

请显示您正在获取的语法错误和上下文。选项3肯定会失败,但前两项应该没问题。 – cdarke

+0

你上面的第一个和第二个选项是正确的,但是你的'EOF'必须是唯一的一行:没有前导标签或空格,也没有尾随垃圾。你看到的问题是bash不认识终结者。 – gilez

回答

4

<<EOF只有信号一个here文档将开始下一行。你可以自由地将其与其他重定向混合,所以选项1和2都是有效的。两者之间没有区别,尽管我怀疑大多数人会喜欢并建议选项1,因为它似乎没有将输出重定向“插入”到here文档中。

如果您使用选项1或选项2得到语法错误,它们几乎肯定与here文档本身无关。

选项3无效,因为这里的文档分隔符必须单独出现在一行上,并且因为它不是原始命令的一部分。

+0

这有助于我的理解,谢谢。我编辑了这个问题,因为我仍然有问题。 –

+0

请添加* exact *命令以产生错误,以及* exact *错误。你现在拥有的是不足以诊断问题的。您应该能够在here文档的其他地方使用分隔符;在单行上只有分隔符本身应该终止这里的文档。 – chepner

0

您可能要引用第一个EOF。选项3不会终止heredoc,所以它是错误的,但其他2应该工作(我通常使用选项2)。你想ssh而不是ftp(即,你是否想要执行产生输出或抓取文件的操作)?下面是我做的ssh:

ssh ... << 'EOF' > file 
remote commands here 
EOF 

也可以管到本地的过程:

ssh ... << 'EOF' | awk ... 
remote commands here 
EOF 
+2

问题中没有任何内容表明引用'EOF'是必要的或不正确的;它完全取决于这里文件的内容应该是什么。 – chepner

+0

您的权利,报价并不总是残缺不全,除了在这种情况下,heredoc的内容显式包含一个cd,这可能不是本地服务器上需要的,而是在远程服务器上。要在远程服务器上执行它,必须引用它 – CSTobey

+2

@CSTobey,不正确。引号防止**扩展**在本地运行,但“cd”不在任何类型的替换或扩展中。如果是,例如'$(cd somewhere; printf'put%q \ n'* .txt)',不仅仅是'cd somewhere',那么你会是对的,但事实并非如此。 –

相关问题