Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Marcel - Lớp vỏ hiện đại hơn dành cho Linux

Marcel là một lớp vỏ mới. Nó giống với shell truyền thống theo nhiều cách, nhưng nó thực hiện một số điều khác biệt:

  • Đường ống :Tất cả các trình bao sử dụng các đường ống để gửi một văn bản từ đầu ra của một lệnh này đến đầu vào của lệnh khác. Marcel chuyển dữ liệu có cấu trúc thay vì các chuỗi ký tự.
  • Python :Marcel được triển khai bằng Python và hiển thị Python theo một số cách. Nếu bạn cần một chút logic trong các lệnh của mình, marcel cho phép bạn diễn đạt nó bằng Python.
  • Viết kịch bản :Marcel có một cách tiếp cận khác thường để viết kịch bản. Tất nhiên, bạn có thể chỉ cần viết một chuỗi lệnh marcel trong một tệp văn bản và thực hiện chúng. Nhưng Marcel cũng cung cấp một API dưới dạng một mô-đun Python. Bạn có thể nhập mô-đun này để thực hiện viết kịch bản Python theo cách thuận tiện hơn nhiều so với cách làm với Python thuần túy.

Marcel được cấp phép theo GPLv3 .

Cài đặt Marcel Modern Shell trong Linux

Marcel yêu cầu Python 3.6 hoặc sau đó. Nó đã được phát triển và thử nghiệm trên Linux và chủ yếu hoạt động trên macOS . (Nếu bạn muốn trợ giúp chuyển sang Windows hoặc để sửa macOS thiếu sót, liên hệ.)

Để cài đặt marcel để sử dụng cho riêng bạn:

# python3 -m pip install marcel

Hoặc nếu bạn muốn cài đặt cho tất cả người dùng (ví dụ:tới /usr/local ):

$ sudo python3 -m pip install --prefix /usr/local marcel

Sau khi bạn đã cài đặt marcel , hãy kiểm tra xem nó có hoạt động không bằng cách chạy lệnh marcel và sau đó tại marcel nhắc, chạy phiên bản lệnh:

$ marcel
Marcel - Lớp vỏ hiện đại hơn dành cho Linux

Tùy chỉnh Marcel Shell

Bạn có thể tùy chỉnh marcel trong tệp ~/.marcel.py , được đọc khi khởi động, (và đọc lại khi được sửa đổi). Như bạn có thể biết từ tên của tệp, việc tùy chỉnh marcel được thực hiện bằng Python.

Một điều bạn có thể muốn làm là tùy chỉnh lời nhắc. Để thực hiện việc này, bạn chỉ định một danh sách cho PROMPT Biến đổi. Ví dụ:nếu bạn muốn lời nhắc của mình là thư mục hiện tại, được in bằng màu xanh lục, theo sau là > in màu xanh lam:

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

Lời nhắc kết quả trông như thế này:

Marcel - Lớp vỏ hiện đại hơn dành cho Linux

Điều này thay thế cho PS1 không thể hiểu được cấu hình mà bạn cần thực hiện trong bash. Màu (0, 4, 0) chỉ định xanh lá cây , (các đối số là RGB giá trị, trong phạm vi 0-5 ). PWD là biến môi trường đại diện cho thư mục hiện tại của bạn và đặt tiền tố cho biến này bằng lambda: tạo một hàm, được đánh giá mỗi khi lời nhắc được hiển thị.

~/.marcel.py cũng có thể nhập các mô-đun Python. Ví dụ:nếu bạn muốn sử dụng các chức năng của mô-đun toán học trong các lệnh marcel của mình:

from math import *

Sau khi thực hiện xong việc này, bạn có thể tham khảo các ký hiệu từ mô-đun đó, ví dụ:pi :

Marcel - Lớp vỏ hiện đại hơn dành cho Linux Marcel - Lớp vỏ hiện đại hơn dành cho Linux

Lưu ý rằng pi được đặt trong ngoặc đơn. Nói chung, marcel sử dụng dấu ngoặc đơn để phân cách các biểu thức Python. Vì vậy, (pi) đánh giá biểu thức Python truy xuất giá trị của biến pi . Bạn cũng có thể truy cập các biến môi trường truyền thống theo cách này, ví dụ: (NGƯỜI DÙNG) (HOME) hoặc bất kỳ biểu thức Python hợp lệ nào dựa trên các ký hiệu trong không gian tên của marcel.

Và tất nhiên, bạn có thể xác định các ký hiệu của riêng mình. Ví dụ:nếu bạn đặt định nghĩa hàm này trong ~/.marcel.py :

def factorial(n):
    f = 1
    for i in range(1, n + 1):
        f *= i
    return f

thì bạn có thể sử dụng hàm giai thừa trên dòng lệnh, ví dụ:

Marcel - Lớp vỏ hiện đại hơn dành cho Linux Marcel - Lớp vỏ hiện đại hơn dành cho Linux

Các ví dụ về Marcel Shell

Ở đây, chúng ta sẽ tìm hiểu một số ví dụ về các lệnh trong marcel shell.

Tìm kích thước tệp theo phần mở rộng

Khám phá thư mục hiện tại một cách đệ quy, nhóm các tệp theo phần mở rộng của chúng (ví dụ:.txt , .py v.v.) và tính tổng kích thước tệp cho mỗi nhóm.

Bạn có thể thực hiện việc này trong marcel như sau:

Marcel - Lớp vỏ hiện đại hơn dành cho Linux

Toán tử ls tạo ra một luồng các đối tượng Tệp, (-fr nghĩa là truy cập các thư mục một cách đệ quy và chỉ trả về các tệp).

Tệp các đối tượng được chuyển đến lệnh tiếp theo, bản đồ. Bản đồ chỉ định một hàm Python, trong dấu ngoặc đơn ngoài cùng, ánh xạ từng tệp tới một bộ chứa phần mở rộng của tệp và kích thước của nó. (Marcel cho phép bỏ qua từ khóa lambda.)

Màu đỏ (giảm) toán tử, nhóm theo phần đầu tiên của bộ ( phần mở rộng ) và sau đó tổng hợp các kích thước trong mỗi nhóm. Kết quả được sắp xếp theo phần mở rộng.

Host Executables và Marcel Pipeline

Đường ống có thể chứa hỗn hợp các toán tử marcel và các tệp thực thi trên máy chủ lưu trữ. Các toán tử nối các đối tượng, nhưng tại ranh giới toán tử / thực thi, thay vào đó, marcel chuyển các chuỗi.

Ví dụ:lệnh này kết hợp các toán tử và tệp thực thi và liệt kê tên người dùng của những người dùng có trình bao là /bin/bash .

$ cat /etc/passwd \
| map (line: line.split(':')) \
| select (*line: line[-1] == '/bin/bash') \
| map (*line: line[0]) \
| xargs echo
Marcel - Lớp vỏ hiện đại hơn dành cho Linux Marcel - Lớp vỏ hiện đại hơn dành cho Linux

cat là một tệp thực thi Linux. Nó đọc / etc / passwd và marcel chuyển nội dung của nó xuống phía dưới bản đồ toán tử marcel.

Đối số trong dấu ngoặc đơn để ánh xạ là một hàm Python chia các dòng tại : dải phân cách, mang lại 7 bộ giá trị. Đ ược chọn là một toán tử marcel có đối số là một hàm Python xác định các bộ giá trị trong đó trường cuối cùng là / bin / bash .

Toán tử tiếp theo, một bản đồ khác giữ trường tên người dùng của mỗi bộ dữ liệu đầu vào. Cuối cùng, xargs echo kết hợp các tên người dùng đến thành một dòng duy nhất, được in ra stdout.

Viết kịch bản trong Marcel Shell

Trong khi Python đôi khi được coi là một ngôn ngữ viết kịch bản, nó không thực sự hoạt động tốt cho mục đích đó. Vấn đề là việc chạy các lệnh shell và các tệp thực thi khác từ Python rất cồng kềnh. Bạn có thể sử dụng os.system() , đơn giản nhưng thường không đủ để xử lý stdin, stdout và stderr. subprocess.Popen() mạnh hơn nhưng phức tạp hơn để sử dụng.

Cách tiếp cận của Marcel là cung cấp một mô-đun tích hợp toán tử marcel với các tính năng ngôn ngữ của Python. Để xem lại ví dụ trước đó, đây là mã Python để tính toán tổng kích thước tệp theo phần mở rộng:

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})

Các lệnh shell vẫn giống như trước đây, ngoại trừ các quy ước cú pháp. Vì vậy, ls -fr biến thành ls (tệp =True , đệ quy =True) . Bản đồ và các toán tử màu đỏ cũng ở đó, được kết nối với các đường ống, như trong phiên bản shell. Toàn bộ lệnh shell (ls… red) tạo ra một trình lặp Python để lệnh có thể được sử dụng với Python’s for a loop.

Truy cập cơ sở dữ liệu với Marcel Shell

Bạn có thể tích hợp quyền truy cập cơ sở dữ liệu với đường ống marcel. Trước tiên, bạn cần định cấu hình quyền truy cập cơ sở dữ liệu trong tệp cấu hình, ~/.marcel.py , ví dụ:

define_db(name='jao',
          driver='psycopg2',
          dbname='acme',
          user='jao')

DB_DEFAULT = 'jao'

Điều này định cấu hình quyền truy cập vào Postgres cơ sở dữ liệu có tên acme , sử dụng psycopg2 người lái xe. Các kết nối từ marcel sẽ được thực hiện bằng jao người dùng và cấu hình cơ sở dữ liệu có tên jao . (DB_DEFAULT chỉ định jao cấu hình cơ sở dữ liệu là cấu hình sẽ được sử dụng nếu không có cấu hình nào được chỉ định.) Với cấu hình này được thực hiện, cơ sở dữ liệu hiện có thể được truy vấn bằng toán tử sql, ví dụ:

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

Lệnh này truy vấn một bảng có tên part và kết xuất kết quả truy vấn vào tệp ~/reorder.csv , ở định dạng CSV.

Truy cập từ xa với Marcel Shell

Tương tự như truy cập cơ sở dữ liệu, truy cập từ xa có thể được định cấu hình trong ~/.marcel.py . Ví dụ:điều này định cấu hình một cụm 4 nút:

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'])

Cụm có thể được xác định là một phòng thí nghiệm trong các lệnh marcel. Thông số nhận dạng và người dùng chỉ định thông tin đăng nhập và máy chủ lưu trữ tham số chỉ định địa chỉ IP của các nút trên cụm.

Khi cụm được định cấu hình, tất cả các nút có thể được vận hành cùng một lúc. Ví dụ:để nhận danh sách pids quy trình và các dòng lệnh trên toàn cụm:

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

Điều này trả về một luồng (địa chỉ IP, PID, dòng lệnh).

Để biết thêm thông tin, hãy truy cập:

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

Marcel là khá mới và đang được phát triển tích cực. Hãy liên hệ nếu bạn muốn giúp đỡ.