웹사이트 검색

Marcel - 보다 현대적인 Linux용 셸


Marcel은 새로운 쉘입니다. 여러 면에서 기존 쉘과 유사하지만 몇 가지 다른 기능을 수행합니다.

  • 파이핑: 모든 셸은 파이프를 사용하여 한 명령의 출력에서 다른 명령의 입력으로 텍스트를 보냅니다. Marcel은 문자열 대신 구조화된 데이터를 파이프합니다.
  • Python: Marcel은 Python으로 구현되며 다양한 방법으로 Python을 노출합니다. 명령에 약간의 논리가 필요한 경우 marcel을 사용하면 이를 Python으로 표현할 수 있습니다.
  • 스크립팅: Marcel은 스크립팅에 특이한 접근 방식을 취합니다. 물론 텍스트 파일에 일련의 marcel 명령을 작성하고 실행할 수도 있습니다. 그러나 Marcel은 Python 모듈 형식의 API도 제공합니다. 이 모듈을 가져와서 일반 Python에서 가능한 것보다 훨씬 더 편리한 방식으로 Python 스크립팅을 수행할 수 있습니다.

MarcelGPLv3에 따라 라이센스가 부여되었습니다.

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-5RGB 값입니다. 강하다>). PWD는 현재 디렉터리를 나타내는 환경 변수이며 이 변수 앞에 lambda:를 붙이면 프롬프트가 표시될 때마다 평가되는 함수가 생성됩니다.

~/.marcel.pyPython 모듈을 가져올 수도 있습니다. 예를 들어, 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 -frls(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은 매우 새롭고 활발한 개발이 진행 중입니다. 도움을 주고 싶으면 연락하세요.