似乎每个核心 Linux 命令都有不同的 stdout 格式。此外,其他脚本/应用程序并不总是能够轻松/安全/一致地解析这些格式。
是否有包装器、规范或库可以提供统一/一致的输出以便于解析(例如 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
替代方案:通用 shell 对象模型
有些贝壳像PowerShell核心有一个通用的内部对象模型,用于在函数之间进行一致的数据配对。 linux core utils 有类似的东西吗?
相关问题
有用的评论
答案1
作为塔克拉斯指出,这里简单的答案是“不”。从历史上看,*nix 操作系统的“the”API 是 C API(如 man 2 而不是 man 1 中记录的)。通用核心 shell 接口唯一真正有用的地方是在无法访问 C API 的语言中……我的意思是在 shell 脚本中。
shell 的主要功能是作为用户界面。
shell 不可避免地不再是一个简单的 UI。能够将命令粘合在一起,从一个命令中获取参数以在另一个命令中使用是非常有用的...但是当您正在寻找强大的解析和通用接口时,是时候转向已经设计的成熟的编程语言了从一开始就作为一种编程语言。
简而言之,不存在创建通用 shell 接口的市场压力。
那些想要快速而简单的脚本来使用少量代码完成某些事情的人将使用 shell(Bash 等)。那些想要编写具有良好 API 的健壮程序的人倾向于使用 Python 等语言或 Go 或 C 等编译语言。
通常不鼓励顺便解析 的输出ls
。最好用通配在外壳本身内。
答案2
答案3
您假设所有这些实用程序大约是在同一时间或由同一个人编写的,或者是为了易于解析。事实并非如此。这些实用程序产生截然不同类型的信息,因此没有人想过统一它们的输出。最后,XML/JSON 和其他格式相对较新,而最初的 Unix 实用程序是 30 多年前编写的,当时处理能力较低且存储成本很高。 XML 和 JSON 都有大约 21 岁的历史了。
是否有包装器、规范或库可以提供统一/一致的输出以便于解析(例如 JSON 或 UniqueName:Value 编码)?
据我所知,没有人这样做过。欢迎补丁。