【发布时间】:2014-08-22 22:52:40
【问题描述】:
我的困境在于将 grep 结果通过管道传输到一个变量以供以后使用。通常,这不是问题,我会使用$( ) 并将结果按原样推送到变量中。
当我需要使用& 运算符并行运行多个 ping 实例时,问题就出现了。一码sn-p:
google_ping=$(ping -c 2 www.google.com | grep -oP '\d+(?=% packet loss)') &
bing_ping=$(ping -c 2 www.bing.com | grep -oP '\d+(?=% packet loss)') &
custom_ping=$(ping -c 2 10.1.1.1 | grep -oP '\d+(?=% packet loss)') &
wait
printf "Google Ping: \t\e[32m %3d\e[0m\n " $google_ping
printf "Bing Ping:\t\e[32m %3d\e[0m\n " $bing_ping
printf "Custom Ping:\t\e[32m %3d\e[0m\n " $custom_ping
我有更多的 ping 操作要运行,并且已经缩短,以使代码不像现在那样混乱。本质上,ping 每个目的地两次,检索每个目的地的丢包,并同时发布所有结果,而不是在它们可用时发布。
我得到的结果似乎是错误输出(一直为 0)而不是数据包丢失。对于custom_ping,这是一个受控测试(总是返回 100% 丢包),结果仍然是 0,而不是这些 grep 应该检索的 100。
像这样按照 printf 运行命令:
printf "Google Ping: \t\e[32m %3d\e[0m\n " $(ping -c 2 www.google.com | grep -oP '\d+(?=% packet loss)') &
#etc...
有时会起作用,但通常会通过将 ping 结果并排放置或放置在另一个内等来扭曲输出。更不用说我需要稍后使用结果的值来执行基于多高的某些操作或者丢包率低,我最终还需要提取数据包所花费的毫秒数。
我尝试了不同的并行运行 ping 的方法;包括使用反引号代替$( ) 并通过2>$1 重定向输出。如果有的话,我想尽可能避免使用临时文件。
还有其他更有效的方法吗?或者也许一种将来自一个站点的所有 ping 结果放入一个变量并使用类似于 grep 的命令或函数来提取我需要的信息的方法?
作为参考,整个脚本位于pastebinhere。
【问题讨论】:
-
我不认为你的结果是零。我认为你的变量是空的。我认为当您执行这样的后台任务时,shell 分配不起作用。