使用此处文档时将bash输出写入文件

时间:2014-09-26 19:10:14

标签: linux bash ftp redhat

我正在编写一个bash脚本来从ftp.gnu.org获取一个存档(特别是gcc-4.9.1源代码),它使用here document。我还希望将ftp的输出定向到日志文件,以便在保留可能需要的任何信息的同时使脚本的输出更清晰。我还想使用bash的双条运行一个错误捕获函数来打印一些输出并在ftp返回失败时退出。

#get the archive
echo "getting the archive from ftp://${HOST}/${FTPPATH}${ARCHIVE}"
/usr/bin/ftp -inv $HOST > ${VERNAME}_logs/ftp.log || errorcatcher "failed to connect to ftp server, check ${VERNAME}_logs/ftp.log" <<FTPSCRIPT 
user anonymous
cd $FTPPATH
binary
get $ARCHIVE
FTPSCRIPT

问题是,这会挂起,而ftp.log看起来像这样:

Trying 208.118.235.20...
Connected to ftp.gnu.org (208.118.235.20).
220 GNU FTP server ready.
ftp>
ftp>
ftp>

这些命令显然没有传递给ftp客户端,我想输出重定向或双管道都会导致这种情况,因为没有它们,脚本都会成功获取存档。

是否有任何语法允许我将交互式命令传递给ftp,同时在返回后仍然允许输出重定向和条件执行?

1 个答案:

答案 0 :(得分:2)

您正在使用此处的文档提供错误的命令。

/usr/bin/ftp [ ...args... ] || errorcatcher [...] <<FTPSCRIPT

应该是

/usr/bin/ftp [ ...args... ] <<FTPSCRIPT || errorcatcher [...]

此文档的内容直到<<后面的行才开始。你甚至可以写

/usr/bin/ftp -inv $HOST > ${VERNAME}_logs/ftp.log <<FTPSCRIPT || 
user anonymous
cd $FTPPATH
binary
get $ARCHIVE
FTPSCRIPT
  errorcatcher "failed to connect to ftp server, check ${VERNAME}_logs/ftp.log"

如果你发现它更具可读性(我不确定我这样做,但它是一个选项),还是

/usr/bin/ftp -inv $HOST > ${VERNAME}_logs/ftp.log <<FTPSCRIPT \
  || errorcatcher "failed to connect to ftp server, check ${VERNAME}_logs/ftp.log"
user anonymous
cd $FTPPATH
binary
get $ARCHIVE
FTPSCRIPT