Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Marcel – Linux를 위한 보다 현대적인 셸

마르셀 새로운 쉘이다. 여러 면에서 기존 셸과 유사하지만 몇 가지 기능이 다릅니다.

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

마르셀 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 – Linux를 위한 보다 현대적인 셸

Marcel Shell 사용자 정의

marcel을 맞춤설정할 수 있습니다. ~/.marcel.py 파일에서 , 시작할 때 읽히고 수정되면 다시 읽습니다. 파일명에서 알 수 있듯 marcel의 커스터마이징은 Python에서 이루어집니다.

아마도 한 가지 하고 싶은 것은 프롬프트를 사용자 정의하는 것입니다. 이렇게 하려면 PROMPT 변하기 쉬운. 예를 들어, 프롬프트가 현재 디렉토리가 되도록 하려면 녹색으로 인쇄되고 그 뒤에 >가 옵니다. 파란색으로 인쇄됨:

PROMPT = [
    Color(0, 4, 0),
    lambda: PWD,
    Color(0, 2, 5),
    '> '
]

결과 프롬프트는 다음과 같습니다.

Marcel – Linux를 위한 보다 현대적인 셸

이것은 불가사의한 PS1을 대체합니다. bash에서 수행해야 하는 구성입니다. 색상(0, 4, 0) 녹색 지정 , (인수는 RGB 0-5 범위의 값 ). PWD는 현재 디렉토리를 나타내는 환경 변수이며 이 변수에 lambda: 접두사를 붙입니다. 프롬프트가 표시될 때마다 평가되는 함수를 생성합니다.

~/.marcel.py Python 모듈을 가져올 수도 있습니다. 예를 들어, marcel 명령에서 수학 모듈의 기능을 사용하려는 경우:

from math import *

이 작업을 완료하면 해당 모듈의 기호를 참조할 수 있습니다. pi :

Marcel – Linux를 위한 보다 현대적인 셸 Marcel – Linux를 위한 보다 현대적인 셸

pi 괄호 안에 있습니다. 일반적으로 마르셀 괄호를 사용하여 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 – Linux를 위한 보다 현대적인 셸 Marcel – Linux를 위한 보다 현대적인 셸

Marcel 셸의 예

여기에서는 marcel 셸의 몇 가지 명령 예를 배웁니다.

확장자로 파일 크기 찾기

현재 디렉토리를 재귀적으로 탐색하고 확장자로 파일을 그룹화합니다(예:.txt , .py 등), 각 그룹의 총 파일 크기를 계산합니다.

다음과 같이 marcel에서 이 작업을 수행할 수 있습니다.

Marcel – Linux를 위한 보다 현대적인 셸

ls 연산자는 File 객체의 스트림을 생성합니다. (-fr 재귀적으로 디렉토리를 방문하고 파일만 반환하는 것을 의미합니다.

파일 개체는 다음 명령인 map으로 파이프됩니다. 지도 각 파일을 파일 확장자와 크기가 포함된 튜플에 매핑하는 가장 바깥쪽 괄호에 Python 함수를 지정합니다. (Marcel에서는 람다 키워드를 생략할 수 있습니다.)

빨간색 (축소) 연산자, 튜플의 첫 번째 부분으로 그룹화(확장자 ) 그런 다음 각 그룹 내의 크기를 합산합니다. 결과는 확장자로 정렬됩니다.

호스트 실행 파일 및 Marcel 파이프라인

파이프라인 marcel 연산자와 호스트 실행 파일이 혼합되어 있을 수 있습니다. 연산자는 개체를 파이프하지만 연산자/실행 가능한 경계에서는 대신 문자열을 파이프합니다.

예를 들어, 이 명령은 연산자와 실행 파일을 결합하고 쉘이 /bin/bash인 사용자의 사용자 이름을 나열합니다. .

$ cat /etc/passwd \
| map (line: line.split(':')) \
| select (*line: line[-1] == '/bin/bash') \
| map (*line: line[0]) \
| xargs echo
Marcel – Linux를 위한 보다 현대적인 셸 Marcel – Linux를 위한 보다 현대적인 셸

cat은 Linux 실행 파일입니다. /etc/passwd라고 읽습니다. , 그리고 marcel은 콘텐츠 다운스트림을 marcel 연산자 맵으로 파이프합니다.

map에 대한 괄호 안의 인수는 :에서 줄을 분할하는 Python 함수입니다. 7-튜플을 생성하는 분리기. 선택 마지막 필드가 /bin/bash인 튜플을 식별하는 Python 함수인 인수를 갖는 marcel 연산자입니다. .

다음 연산자인 다른 맵은 각 입력 튜플의 사용자 이름 필드를 유지합니다. 마지막으로 xargs echo 들어오는 사용자 이름을 한 줄로 결합하여 stdout에 인쇄합니다.

Marcel Shell의 스크립팅

파이썬 동안 때때로 스크립팅 언어로 간주되지만 실제로는 그 목적에 적합하지 않습니다. 문제는 셸 명령과 Python의 다른 실행 파일을 실행하는 것이 번거롭다는 것입니다. os.system()을 사용할 수 있습니다. , 간단하지만 종종 stdin, stdout 및 stderr을 다루기에 부적절합니다. 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'

Postgres에 대한 액세스를 구성합니다. 이름이 acme인 데이터베이스 , psycopg2 사용 운전사. jao를 사용하여 marcel에서 연결됩니다. 사용자이고 데이터베이스 프로필의 이름은 jao입니다. . (DB_DEFAULT는 jao를 지정합니다. 프로필이 지정되지 않은 경우 데이터베이스 프로필이 사용됩니다.) 이 구성이 완료되면 이제 sql 연산자를 사용하여 데이터베이스를 쿼리할 수 있습니다(예:

).
sql 'select part_name, quantity from part where quantity < 10' \
| out --csv –-file ~/reorder.csv

이 명령은 part라는 테이블을 쿼리합니다. , 쿼리 결과를 ~/reorder.csv 파일에 덤프합니다. , 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'])

클러스터는 실험실로 식별될 수 있습니다. 마르셀 명령에서. 사용자 및 ID 매개변수는 로그인 정보를 지정하고 호스트 매개변수는 클러스터에 있는 노드의 IP 주소를 지정합니다.

클러스터가 구성되면 모든 노드에서 한 번에 작동할 수 있습니다. 예를 들어 프로세스 pid 목록을 가져오려면 클러스터 전체의 명령줄:

@lab [ps | map (proc: (proc.pid, proc.commandline))]

(IP 주소, PID, 명령줄) 튜플의 스트림을 반환합니다.

자세한 내용은 다음을 방문하십시오:

  • https://www.marceltheshell.org/
  • https://github.com/geophile/marcel

마르셀 꽤 새롭고 활발한 개발 중입니다. 도움이 필요하시면 연락주세요.