我的难题在于将grep结果传递给变量以供以后使用。通常,这不会有问题,我会使用$( )
并将结果按原样推送到变量中。
当我需要使用&
运算符并行运行多个ping实例时,就会出现问题。一个代码片段:
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,而不是应检索的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的命令或函数来提取我需要的信息的方法?
作为参考,整个脚本位于此处的pastebin上。
如果不使用临时文件之类的东西,根本无法做您想做的事情。(或类似的半永久性存储,如memcached或redis。)幸运的是,所有这些解决方案都相当快。您的/tmp
目录很有可能实际上是一个虚拟磁盘,如果不是,则可以制作一个或使用一种内存缓存解决方案。
您正在使用的命令:
var=$(pipeline) &
原因var=$(pipeline)
在后台子shell中运行。在该外壳中,将执行管道,并且其输出将由子外壳的捕获$var
。但这没有用,因为子外壳将要终止,并带有其变量。
您可以将放到的&
内部$(...)
,在这种情况下,值将分配到$var
外壳中。但是命令替换$(pipeline&)
将替换wait
为pipeline
,这完全违背了pipeline
在后台运行的目的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句