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>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)
时,您是在告诉 subshell 您生成以将其 stderr 输出转移到 stdout。
以上只是我粗略的解释。 bash 联机帮助页中有一个更完善的。
我有一个 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>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)
时,您是在告诉 subshell 您生成以将其 stderr 输出转移到 stdout。
以上只是我粗略的解释。 bash 联机帮助页中有一个更完善的。