核心 Linux 命令是否有统一的标准输出数据格式(用于一致/轻松解析)?

核心 Linux 命令是否有统一的标准输出数据格式(用于一致/轻松解析)?

似乎每个核心 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

“通用内部对象模型”——事物并不是真正的外壳属性;而是一个外壳属性。它是底层操作系统的属性。

在 Windows 中你有类似的东西CIM或者WMI

在 Linux 中,命令倾向于输出纯文本,或多或少是有序格式的 - 正如 @GMaster 评论的那样,有一些工具可用于处理输出的文本。这意味着您通常会将命令通过管道连接在一起,并将它们命名为简短的名称(如果您经常这样做)。

答案3

您假设所有这些实用程序大约是在同一时间或由同一个人编写的,或者是为了易于解析。事实并非如此。这些实用程序产生截然不同类型的信息,因此没有人想过统一它们的输出。最后,XML/JSON 和其他格式相对较新,而最初的 Unix 实用程序是 30 多年前编写的,当时处理能力较低且存储成本很高。 XML 和 JSON 都有大约 21 岁的历史了。

是否有包装器、规范或库可以提供统一/一致的输出以便于解析(例如 JSON 或 UniqueName:Value 编码)?

据我所知,没有人这样做过。欢迎补丁。

相关内容