wget 捕获标准输出到变量

wget capture stdout to variable

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

sOut 是空的,因为你没有直接输出

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

干杯

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 和 X and/or 转移其标准输出的输出 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) 时,您是在告诉 subshell 您生成以将其 stderr 输出转移到 stdout。

以上只是我粗略的解释。 bash 联机帮助页中有一个更完善的。