我有一个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读取最终消息。但是,如果它刚刚返回整个消息的最后一行,我现在很高兴。因为它是空的
答案 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>out
与foo >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)
干杯