似乎每个核心 Linux 命令都有不同的标准输出格式。此外,其他脚本/应用程序并不总是容易/安全/一致地解析这些格式。
是否有包装器或规范或库提供统一/一致的输出以便于解析(如 JSON 或 UniqueName:Value 编码)?
示例 1:ps -A
PID TTY TIME CMD
558 tty1 00:00:00 startx
576 tty1 00:00:00 xinit
577 tty1 00:00:37 Xorg
590 tty1 00:00:01 awesome
8281 pts/0 00:00:00 ps
示例 2:lshw / lscpu
虽然lshw
是键:值输出,但很难解析成唯一的键:值对。
cedar
description: Computer
width: 64 bits
capabilities: smp vsyscall32
*-core
description: Motherboard
physical id: 0
*-memory
description: System memory
physical id: 0
size: 7936MiB
*-cpu
product: Intel(R) Core(TM) i5-6300U CPU @ 2.40GHz
vendor: Intel Corp.
physical id: 1
bus info: cpu@0
size: 2611MHz
capacity: 3GHz
<SNIP>
示例 3:ls -l
total 36
drwxr-xr-x 2 guy guy 4096 Nov 19 08:41 Desktop
drwxr-xr-x 2 guy guy 4096 Dec 26 13:37 Downloads
drwxr-xr-x 3 guy guy 4096 Nov 7 19:39 go
drwxr-xr-x 6 guy guy 4096 Jan 15 12:42 play
drwxr-xr-x 12 guy guy 4096 Jan 16 19:27 repo
drwxr-xr-x 3 guy guy 4096 Oct 15 18:39 RiderProjects
drwxr-xr-x 8 guy guy 4096 Jan 13 17:38 scripts
drwxr-xr-x 12 guy guy 4096 Jan 10 16:48 source
drwxr-xr-x 6 guy guy 4096 Jan 4 14:31 temp
例 4。file /bin/bash
/bin/bash: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=6c75f9f0f273cf6549f078b042c0a3f5a04f0357, for GNU/Linux 4.4.0, stripped
替代方案:通用外壳对象模型
PowerShell Core等一些 shell具有通用的内部对象模型,用于在函数之间进行一致的数据配对。有类似 linux core utils 的东西吗?
相关问题
有用的评论
lshw
,lscpu
,ps
不是 GNU coreutils Stéphane Chazelas 的一部分- coreutils 不是单数:GNU、toybox(Android)或busybox(大多数其他)
正如Taqras 所指出的,这里的简单答案是“不”。从历史上看,*nix 操作系统的“the”API 一直是 C API(如 man 2 而不是 man 1 中所述)。通用核心 shell 接口真正有用的唯一地方就是无法访问 C API 的语言......我的意思是在 shell 脚本中。
shell 的主要功能是作为用户界面。
不可避免地,shell 已经不仅仅是一个简单的 UI。能够将命令粘合在一起,从一个命令中获取参数以在另一个命令中使用是非常有用的......但是当您正在寻找强大的解析和通用接口时,是时候转向已经设计好的成熟的编程语言了从一开始就作为一种编程语言。
简而言之,创建通用外壳接口的市场压力并不大。
那些想要快速简单的脚本用少量代码完成某事的人将使用 shell(Bash 等)。那些想要编写具有良好 API 的健壮程序的人倾向于转向 Python 之类的语言或 Go 或 C 之类的编译语言。
ls
通常不鼓励顺便解析 的输出。最好在外壳本身内使用通配符。“通用内部对象模型”——并不是真正的 shell 属性;它是底层操作系统的属性。
在 Windows 中,您有CIM或WMI之类的东西。
在 Linux 中,命令倾向于输出纯文本,或多或少是有序格式的——正如@GMaster 评论的那样,有一些工具可用于处理输出的文本。这意味着您通常会将命令连接在一起,并将它们别名为简短的,如果这是您经常做的事情。
您假设所有这些实用程序几乎是同时编写的,或者是由同一个人编写的,或者是为了易于解析。事实并非如此。这些实用程序产生了截然不同类型的信息,因此没有人想到统一它们的输出。最后,XML/JSON 和其他格式相对较新,而最初的 Unix 实用程序是在 30 多年前编写的,当时处理能力很低,存储成本很高。XML 和 JSON 都有 21 年的历史了。
据我所知,没有人这样做过。欢迎使用补丁。