wget将stdout捕获到变量

时间:2015-12-07 09:36:14

标签: shell wget

我有一个shell脚本,我想把它放入chronjob,它应该每天获取数据,然后写一个快速的日志条目。我希望日志条目看起来像:

2015-12-07 11:16:34: No such file ‘CatchUpPlusActivity_20150801’.
2015-12-07 11:24:20: (14,4 MB/s) - ‘CatchUpPlusActivity_20150801.csv.gz’ saved [52690279]
2015-12-07 11:28:40: File ‘CatchUpPlusActivity_20150801.csv.gz’ already there; not retrieving.

我的shell脚本如下所示:

sPath="ftp://user:pass@10.10.23.32/public/download/exports/webactivity/PullVODData/"
sFiles="CatchUpPlusActivity_20150801*"

sOut=$(sudo wget ${sPath}${sFiles} -nc)

now="$(date +"%Y-%m-%d %H:%M:%S")"
echo ${now}: ${sOut}  >> /path/to/logs/catchup_plus.log

我希望sOut从每个ftp读取最终消息。但是,如果它刚刚返回整个消息的最后一行,我现在很高兴。因为它是空的

2 个答案:

答案 0 :(得分:2)

wget的[progress]输出转到stderr,因此请更改命令:

OLD:sOut=$(sudo wget ${sPath}${sFiles} -nc)
新:sOut=$(sudo wget ${sPath}${sFiles} -nc 2>&1)

这会将所有行捕获到单个标量中。因此,如果您想查看单个行,则需要将sOut拆分为数组变量或其他类型。

<强>更新

要回答您的后续问题,2>&1是一件好事。

就类似C的文件描述符编号而言,0 = stdin,1 = stdout,2 = stderr。您可以完成wget ... 2>wget.log,文件wget.log将与我给您的命令具有相同的输出。

对于任何命令,“foo”(例如)你可以用foo 1>X 2>Y转移其标准输出的输出,而X和/或Y可以是一个文件或另一个流描述符 [ &Z语法]。

注意foo 1>outfoo >out相同,因为“1”是默认流。 foo 2>&1 >out表示将流2转移到与流1相同的位置,此处为out。请注意foo >out 2>&1也有效

这也适用于追加。 foo 2>&1 >>out

您的sOut语法表示捕获命令的stdout [stream 1]的输出。也就是sOut=$(foo)。当你执行sOut=$(foo 2>&1)时,你正在告诉子shell ,你将它的stderr输出转移到stdout。

以上只是我粗略的解释。在bash手册页中有一个更加优雅的。

答案 1 :(得分:0)

sOut为空,因为您没有指导输出

sOut=$(echo wget ${sPath}${sFiles} -nc)

干杯