모든 핵심 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
대안: 일반 쉘 객체 모델
일부 껍질은 다음과 같습니다파워셸 코어기능 간의 일관된 데이터 쌍을 위한 공통 내부 개체 모델이 있습니다. Linux 핵심 유틸리티와 비슷한 것이 있습니까?
관련 질문
- 모든 CLI 명령을 호환 가능하게 만들기 위해 "--json" 매개변수를 추가하도록 GNU를 옹호하는 방법은 무엇입니까?
- https://unix.stackexchange.com/a/515886/457338
유용한 의견
lshw
,lscpu
,ps
GNU coreutils의 일부가 아님 스티븐 차제라스- coreutils는 모놀리식이 아닙니다.암소 비슷한 일종의 영양,장난감 상자(안드로이드) 또는바쁜 상자(대부분의 기타)
답변1
~처럼타크라스는 지적했다, 여기서 간단한 대답은 "아니요"입니다. 역사적으로 *nix 운영 체제의 "the" API는 C API였습니다(man 1이 아닌 man 2에 설명되어 있음). 공통 코어 셸 인터페이스가 실제로 유용한 유일한 곳은 C API에 액세스할 수 없는 언어입니다... 즉, 셸 스크립트를 의미합니다.
쉘의 주요 기능은 사용자 인터페이스입니다.
쉘은 필연적으로 더 이상 단순한 UI가 아닙니다. 명령을 서로 연결하고 한 명령에서 다른 명령에 사용할 매개변수를 얻을 수 있다는 것은 매우 유용합니다... 하지만 강력한 구문 분석과 공통 인터페이스를 찾고 있다면 이제 이미 설계된 성숙한 프로그래밍으로 전환해야 할 때입니다. 언어는 다음과 같습니다. 처음부터 프로그래밍 언어로 설계되었습니다.
즉, 범용 쉘 인터페이스를 만들라는 시장 압력이 없습니다.
적은 양의 코드로 작업을 수행하기 위해 빠르고 간단한 스크립트를 원하는 사람들은 쉘(Bash 등)을 사용합니다. 좋은 API로 강력한 프로그램을 작성하려는 사람들은 Python과 같은 언어나 Go 또는 C와 같은 컴파일된 언어를 사용하는 경향이 있습니다.
부수적으로 구문 분석된 출력은 일반적으로 권장되지 않습니다 ls
. 사용하기 가장 좋습니다와일드카드케이싱 자체 내에서.
답변2
답변3
이러한 유틸리티는 모두 같은 시기에 또는 같은 사람이 작성했거나 구문 분석을 쉽게 하기 위해 작성했다고 가정합니다. 그러나 실제로는 그렇지 않습니다. 이러한 유틸리티는 매우 다양한 유형의 정보를 생성하므로 누구도 해당 출력을 통합할 생각을 하지 않았습니다. 마지막으로, XML/JSON 및 기타 형식은 비교적 새로운 형식인 반면, 원래 Unix 유틸리티는 처리 능력이 낮고 저장 비용이 높았던 30년 전에 작성되었습니다. XML과 JSON은 모두 약 21년이 되었습니다.
쉬운 구문 분석을 위해 균일하고 일관적인 출력을 제공할 수 있는 래퍼, 사양 또는 라이브러리가 있습니까(예: JSON 또는 UniqueName:Value 인코딩)?
내가 아는 한, 아무도 이런 일을 한 적이 없습니다. 패치를 환영합니다.