使用wget将标准输出保存到变量中

4

我有一个Shell脚本,想将其放入定时任务中,每天获取数据并写入一个快速日志条目。我希望日志条目看起来像这样:

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的最终消息。但是,如果它只返回整个消息的最后一行,我也会很高兴。目前sOut为空。

2个回答

4
wget的[progress]输出会发送到stderr,因此更改您的命令:
旧:sOut=$(sudo wget ${sPath}${sFiles} -nc)
新:sOut=$(sudo wget ${sPath}${sFiles} -nc 2>&1) 这将捕获所有行到单个标量中。因此,如果要查看单独的行,则需要将sOut拆分为数组变量或类似的东西。
更新:
回答您的后续问题,2>&1是一个shell命令。
以类似C的文件描述符编号表示,0=stdin,1=stdout,2=stderr。您可以使用wget ... 2>wget.log,文件wget.log将具有与我给您的命令相同的输出。
对于任何命令“foo”(例如),您都可以使用foo 1>X 2>Y来转移其stdout的输出,并且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 [流1]输出。也就是说,sOut=$(foo)。当您执行sOut=$(foo 2>&1)时,您告诉您生成的子shell将其stderr输出重定向到stdout。
以上只是我简略的解释。bash手册中有一个更精细的解释。

2>&1是什么意思?这是wget特有的还是shell通用的语法? - Roman
这是一个绝对精彩的解释,谢谢!我希望我能给你更多的积分 :) - Roman
@Roman 不用谢!顺便说一下,通常我会用perl编写脚本。所以,尽管我有相当多的脚本编写经验,但在半高级bash方面我还是有点新手。除了man页面外,我还发现了一个非常好的在线资源:http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html。man页面只是像参考书一样,很难从中编程。指南页面实际上提供了非常好的示例供参考。我能够根据指南中找到的信息回答另一个SO bash问题。 - Craig Estey

0

sOut 是空的,因为你没有将输出指向它。

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

干杯


请再次查看。echo ${now}: ${sOut} >> /path/to/logs/catchup_plus.log - Roman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接