Marcel - 보다 현대적인 Linux용 셸
Marcel은 새로운 쉘입니다. 여러 면에서 기존 쉘과 유사하지만 몇 가지 다른 기능을 수행합니다.
- 파이핑: 모든 셸은 파이프를 사용하여 한 명령의 출력에서 다른 명령의 입력으로 텍스트를 보냅니다. Marcel은 문자열 대신 구조화된 데이터를 파이프합니다.
- Python: Marcel은 Python으로 구현되며 다양한 방법으로 Python을 노출합니다. 명령에 약간의 논리가 필요한 경우 marcel을 사용하면 이를 Python으로 표현할 수 있습니다.
- 스크립팅: Marcel은 스크립팅에 특이한 접근 방식을 취합니다. 물론 텍스트 파일에 일련의 marcel 명령을 작성하고 실행할 수도 있습니다. 그러나 Marcel은 Python 모듈 형식의 API도 제공합니다. 이 모듈을 가져와서 일반 Python에서 가능한 것보다 훨씬 더 편리한 방식으로 Python 스크립팅을 수행할 수 있습니다.
Marcel은 GPLv3에 따라 라이센스가 부여되었습니다.
Linux에 Marcel Modern Shell 설치
Marcel에는 Python 3.6 이상이 필요합니다. Linux에서 개발 및 테스트되었으며 대부분 macOS에서 작동합니다. (Windows로 포팅하는 데 도움을 주거나 macOS 결함을 해결하려면 문의하세요.)
자신이 사용할 marcel을 설치하려면 다음 단계를 따르세요.
python3 -m pip install marcel
또는 모든 사용자를 위해 설치하려는 경우(예: /usr/local
):
sudo python3 -m pip install --prefix /usr/local marcel
marcel을 설치한 후 marcel 명령을 실행하여 작동하는지 확인한 다음 marcel 프롬프트에서 버전을 실행하세요. 명령:
marcel
Marcel Shell의 사용자 정의
시작 시 읽고 수정 시 다시 읽는 ~/.marcel.py
파일에서 marcel을 사용자 정의할 수 있습니다. 파일 이름에서 알 수 있듯이 marcel의 사용자 정의는 Python에서 수행됩니다.
아마도 당신이 원하는 것 중 하나는 프롬프트를 사용자 정의하는 것입니다. 이렇게 하려면 PROMPT 변수에 목록을 할당합니다. 예를 들어, 프롬프트가 현재 디렉토리가 되도록 하고 녹색으로 인쇄되고 그 뒤에 >
가 파란색으로 인쇄되도록 하려면:
PROMPT = [
Color(0, 4, 0),
lambda: PWD,
Color(0, 2, 5),
'> '
]
결과 프롬프트는 다음과 같습니다.
이는 bash에서 수행해야 하는 이해하기 어려운 PS1
구성을 대체합니다. Color(0, 4, 0)은 녹색을 지정합니다. (인수는 0-5범위의 RGB 값입니다. 강하다>). PWD는 현재 디렉터리를 나타내는 환경 변수이며 이 변수 앞에 lambda:
를 붙이면 프롬프트가 표시될 때마다 평가되는 함수가 생성됩니다.
~/.marcel.py
는 Python 모듈을 가져올 수도 있습니다. 예를 들어, marcel 명령에서 math 모듈의 기능을 사용하려는 경우:
from math import *
이 작업을 완료하면 해당 모듈의 기호를 참조할 수 있습니다. 파이
:
pi
는 괄호 안에 표시됩니다. 일반적으로 marcel은 괄호를 사용하여 Python 표현식을 구분합니다. 따라서 (pi)
는 변수 pi의 값을 검색하는 Python 표현식을 평가합니다. 이런 방식으로 기존 환경 변수에 액세스할 수도 있습니다. (USER) 및 (HOME) 또는 marcel의 네임스페이스에 있는 기호를 사용하는 유효한 Python 표현식입니다.
물론 자신만의 기호를 정의할 수도 있습니다. 예를 들어, 이 함수 정의를 ~/.marcel.py
에 넣으면:
def factorial(n):
f = 1
for i in range(1, n + 1):
f *= i
return f
그런 다음 명령줄에서 계승 함수를 사용할 수 있습니다.
마르셀 쉘 예
여기에서는 marcel 쉘의 몇 가지 명령 예를 알아봅니다.
확장자로 파일 크기 찾기
현재 디렉터리를 재귀적으로 탐색하고 파일을 확장자(예: .txt
, .py
등)별로 그룹화하고 각 그룹의 총 파일 크기를 계산합니다.
marcel에서는 다음과 같이 이 작업을 수행할 수 있습니다.
ls 연산자는 File 객체 스트림을 생성합니다(-fr
는 디렉토리를 재귀적으로 방문하고 파일만 반환함을 의미함).
파일 개체는 다음 명령인 map으로 파이프됩니다. 맵은 가장 바깥쪽 괄호 안에 Python 함수를 지정합니다. 이 함수는 각 파일을 파일 확장자와 크기를 포함하는 튜플에 매핑합니다. (Marcel은 람다 키워드 생략을 허용합니다.)
빨간색(축소) 연산자는 튜플(확장)의 첫 번째 부분으로 그룹화한 다음 각 그룹 내의 크기를 합산합니다. 결과는 확장자별로 정렬됩니다.
호스트 실행 파일 및 Marcel 파이프라인
파이프라인에는 marcel 연산자와 호스트 실행 파일이 혼합되어 포함될 수 있습니다. 연산자는 개체를 파이프하지만 연산자/실행 가능 경계에서는 대신 marcel이 문자열을 파이프합니다.
예를 들어, 이 명령은 연산자와 실행 파일을 결합하고 쉘이 /bin/bash
인 사용자의 사용자 이름을 나열합니다.
cat /etc/passwd \
| map (line: line.split(':')) \
| select (*line: line[-1] == '/bin/bash') \
| map (*line: line[0]) \
| xargs echo
cat은 Linux 실행 파일입니다. /etc/passwd를 읽고 marcel은 그 내용을 marcel 연산자 맵으로 다운스트림으로 파이프합니다.
map에 괄호로 묶인 인수는 :
구분 기호에서 행을 분할하여 7개의 튜플을 생성하는 Python 함수입니다. select는 마지막 필드가 /bin/bash인 튜플을 식별하는 Python 함수를 인수로 사용하는 marcel 연산자입니다.
다음 연산자인 또 다른 맵은 각 입력 튜플의 사용자 이름 필드를 유지합니다. 마지막으로 xargs echo는 들어오는 사용자 이름을 한 줄로 결합하여 stdout에 인쇄합니다.
Marcel Shell에서 스크립팅
Python은 때때로 스크립트 언어로 간주되지만 실제로는 해당 목적에 적합하지 않습니다. 문제는 Python에서 쉘 명령과 기타 실행 파일을 실행하는 것이 번거롭다는 것입니다. 간단하지만 stdin, stdout 및 stderr을 처리하는 데 종종 부적합한 os.system()
을 사용할 수 있습니다. subprocess.Popen()
은 더 강력하지만 사용하기가 더 복잡합니다.
Marcel의 접근 방식은 marcel 연산자와 Python의 언어 기능을 통합하는 모듈을 제공하는 것입니다. 이전 예제를 다시 살펴보려면 다음은 확장자별 파일 크기 합계를 계산하기 위한 Python 코드입니다.
from marcel.api import *
for ext, size in (ls(file=True, recursive=True)
| map(lambda f: (f.suffix, f.size))
| red('.', '+')):
print(f'{ext}: {size})
셸 명령은 구문 규칙을 제외하면 이전과 동일합니다. 따라서 ls -fr
은 ls(file=True, recursive=True)로 변경됩니다. 맵과 빨간색 연산자도 쉘 버전처럼 파이프로 연결되어 있습니다. 전체 쉘 명령 (ls … red)은 명령이 Python의 for 루프와 함께 사용될 수 있도록 Python 반복자를 생성합니다.
Marcel Shell을 사용한 데이터베이스 액세스
Marcel 파이프라인과 데이터베이스 액세스를 통합할 수 있습니다. 먼저 구성 파일 ~/.marcel.py
에서 데이터베이스 액세스를 구성해야 합니다.
define_db(name='jao',
driver='psycopg2',
dbname='acme',
user='jao')
DB_DEFAULT = 'jao'
이는 psycopg2 드라이버를 사용하여 acme라는 Postgres 데이터베이스에 대한 액세스를 구성합니다. marcel의 연결은 jao 사용자를 사용하여 이루어지며 데이터베이스 프로필 이름은 jao입니다. (DB_DEFAULT는 프로필이 지정되지 않은 경우 사용할 프로필로 jao 데이터베이스 프로필을 지정합니다.) 이 구성이 완료되면 이제 SQL 연산자를 사용하여 데이터베이스를 쿼리할 수 있습니다.
sql 'select part_name, quantity from part where quantity < 10' \
| out --csv –-file ~/reorder.csv
이 명령은 part라는 테이블을 쿼리하고 쿼리 결과를 CSV 형식의 ~/reorder.csv
파일에 덤프합니다.
Marcel Shell을 사용한 원격 액세스
데이터베이스 액세스와 마찬가지로 ~/.marcel.py
에서 원격 액세스를 구성할 수 있습니다. 예를 들어 다음은 4노드 클러스터를 구성합니다.
define_remote(name='lab',
user='frankenstein',
identity='/home/frankenstein/.ssh/id_rsa',
host=['10.0.0.100',
'10.0.0.101',
'10.0.0.102',
'10.0.0.103'])
클러스터는 marcel 명령에서 실험실로 식별될 수 있습니다. 사용자 및 ID 매개변수는 로그인 정보를 지정하고 host 매개변수는 클러스터에 있는 노드의 IP 주소를 지정합니다.
클러스터가 구성되면 모든 노드를 동시에 운영할 수 있습니다. 예를 들어 클러스터 전체에서 프로세스 pid 및 명령줄 목록을 가져오려면 다음을 수행하세요.
@lab [ps | map (proc: (proc.pid, proc.commandline))]
이는 (IP 주소, PID, 명령줄) 튜플 스트림을 반환합니다.
자세한 내용은 다음을 방문하세요.
- https://www.marceltheshell.org/
- https://github.com/geophile/marcel
Marcel은 매우 새롭고 활발한 개발이 진행 중입니다. 도움을 주고 싶으면 연락하세요.