Linux 最小化对shell命令stdout的依赖

Linux 最小化对shell命令stdout的依赖,linux,bash,shell,Linux,Bash,Shell,在我的应用程序中,我使用bash脚本来收集各种系统信息。为了获得所需的信息,我正在解析shell命令的输出。例如,要获取我的wifi模块的操作模式,我使用以下脚本 iwconfig wlan0 | awk -F 'Mode:' '{ m = $2; sub(/ .*/, "", m); print m }' 脚本高度依赖于iwconfig wlan0的输出 wlan0 IEEE 802.11 ESSID:"Foo" Mode

在我的应用程序中,我使用bash脚本来收集各种系统信息。为了获得所需的信息,我正在解析shell命令的输出。例如,要获取我的wifi模块的操作模式,我使用以下脚本

iwconfig wlan0 | awk -F 'Mode:' '{ m = $2; sub(/ .*/, "", m); print m }'
脚本高度依赖于
iwconfig wlan0的输出

wlan0     IEEE 802.11  ESSID:"Foo"
          Mode:Managed  Frequency:5.62 GHz  Access Point: 44:4E:6D:67:7A:0D   
          Bit Rate=24 Mb/s   Tx-Power=31 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
          Link Quality=70/70  Signal level=-28 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

如果系统更新后,
iwconfig wlan0
的输出发生更改,则我的应用程序很可能会中断。在现实世界的应用程序代码中,这个示例性问题是如何处理的?

理想情况下,找到一个稳定的API,该API不会产生可在版本之间以及可能在区域设置之间更改的人类可读输出。在Linux上,
/proc
文件系统提供了系统状态许多方面的稳定、机器可读的表示

对于其他方面,现代实用程序通常可以选择生成JSON或其他机器可读的输出(在过去,XML扮演着类似的角色,但正确解析要简单得多)


如果您必须针对这样的人类可读格式编写代码,请尝试找到稳定、可靠的测试用例,并在启动时运行这些测试用例,或者在测试套件中运行这些测试用例。如果你不能得到你所期望的结果,有些事情就改变了。当然,您的测试用例需要足够具体和严格,以实际测试您关心的所有方面。(举个例子,也许
iwlan lo
是合理的静态和可预测的,可以作为测试用例在任何地方工作?

我认为没有通用的规则或配方。某些命令提供可选的机器可读输出格式。或者在某些情况下,您可以在
/proc
文件系统中的某个位置找到信息。如果您知道命令输出有不同的格式,则脚本可以检查命令的版本或尝试检测输出格式。了解
iwconfig
如何收集您关心的信息。做同样的事情。那就是一个接一个的传球也是很容易避免的。对于您的情况,请尝试
iwconfig wlan0 | awk-F'模式:'{m=$2;sub(/.*/,'',m);print m}'
@tripleee谢谢您的输入,我更新了问题中的命令。而且,你的书读得很好。