ค้นหาเว็บไซต์

Marcel - เชลล์ที่ทันสมัยยิ่งขึ้นสำหรับ Linux


มาร์เซล เป็นเชลล์ใหม่ มันคล้ายกับเปลือกหอยแบบดั้งเดิมในหลายๆ ด้าน แต่มีบางสิ่งที่แตกต่างออกไป:

  • การวางท่อ: เชลล์ทั้งหมดใช้ไปป์เพื่อส่งข้อความจากเอาต์พุตของคำสั่งหนึ่งไปยังอินพุตของคำสั่งอื่น Marcel ไปป์ข้อมูลที่มีโครงสร้างแทนสตริง
  • Python: Marcel ได้รับการปรับใช้ใน Python และเปิดเผย Python ในหลายวิธี หากคุณต้องการตรรกะเล็กน้อยในคำสั่งของคุณ Marcel จะอนุญาตให้คุณแสดงมันใน Python
  • การเขียนสคริปต์: Marcel ใช้แนวทางที่ไม่ธรรมดาในการเขียนสคริปต์ แน่นอนคุณสามารถเขียนลำดับคำสั่ง Marcel ในไฟล์ข้อความและดำเนินการได้ แต่ Marcel ยังจัดเตรียม API ในรูปแบบของโมดูล Python อีกด้วย คุณสามารถนำเข้าโมดูลนี้เพื่อทำสคริปต์ Python ได้ในวิธีที่สะดวกกว่าการใช้ Python ธรรมดา

Marcel ได้รับอนุญาตภายใต้ GPLv3

การติดตั้ง Marcel Modern Shell ใน Linux

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 ให้เรียกใช้ version คำสั่ง:

marcel

การปรับแต่ง Marcel Shell

คุณสามารถปรับแต่ง marcel ได้ในไฟล์ ~/.marcel.py ซึ่งจะอ่านเมื่อเริ่มต้นระบบ (และอ่านซ้ำเมื่อมีการแก้ไข) ดังที่คุณทราบได้จากชื่อไฟล์ การปรับแต่ง Marcel ทำได้ใน Python

สิ่งหนึ่งที่คุณอาจต้องการทำคือปรับแต่งพรอมต์ ในการดำเนินการนี้ คุณจะต้องกำหนดรายการให้กับตัวแปร PROMPT ตัวอย่างเช่น หากคุณต้องการให้ prompt เป็นไดเร็กทอรีปัจจุบัน พิมพ์เป็นสีเขียว ตามด้วย > พิมพ์เป็นสีน้ำเงิน:

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

พรอมต์ผลลัพธ์จะมีลักษณะดังนี้:

สิ่งนี้จะแทนที่การกำหนดค่า PS1 ที่ไม่น่าเชื่อถือซึ่งคุณจะต้องทำใน bash สี(0, 4, 0) ระบุ สีเขียว (อาร์กิวเมนต์คือค่า RGB ในช่วง 0-5) PWD คือตัวแปรสภาพแวดล้อมที่แสดงถึงไดเร็กทอรีปัจจุบันของคุณ และนำหน้าตัวแปรนี้ด้วย lambda: จะสร้างฟังก์ชัน โดยจะประเมินทุกครั้งที่มีการแสดงข้อความแจ้ง

~/.marcel.py ยังสามารถนำเข้าโมดูล Python ได้อีกด้วย เช่น หากคุณต้องการใช้ฟังก์ชันของโมดูลคณิตศาสตร์ในคำสั่ง Marcel ของคุณ:

from math import *

เมื่อคุณทำสิ่งนี้แล้ว คุณสามารถอ้างอิงถึงสัญลักษณ์จากโมดูลนั้นได้ เช่น <รหัส>ปี่:

โปรดทราบว่า pi อยู่ในวงเล็บ โดยทั่วไป marcel จะใช้วงเล็บเพื่อกำหนดขอบเขตนิพจน์ Python ดังนั้น (pi) จะประเมินนิพจน์ Python ที่ดึงค่าของตัวแปร pi คุณยังสามารถเข้าถึงตัวแปรสภาพแวดล้อมแบบเดิมได้ด้วยวิธีนี้ เช่น (USER) และ (HOME) หรือนิพจน์ Python ที่ถูกต้องใดๆ ที่ใช้สัญลักษณ์ในเนมสเปซของ Marcel

และแน่นอนว่าคุณสามารถกำหนดสัญลักษณ์ของคุณเองได้ ตัวอย่างเช่น หากคุณใส่คำจำกัดความของฟังก์ชันนี้ใน ~/.marcel.py:

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

จากนั้นคุณสามารถใช้ฟังก์ชันแฟกทอเรียลบนบรรทัดคำสั่งได้ เช่น

ตัวอย่างของมาร์เซล เชลล์

เราจะเรียนรู้ตัวอย่างคำสั่งต่างๆ ใน Marcel Shell

ค้นหาขนาดไฟล์ตามนามสกุล

สำรวจไดเรกทอรีปัจจุบันแบบวนซ้ำ จัดกลุ่มไฟล์ตามนามสกุล (เช่น .txt, .py และอื่นๆ) และคำนวณขนาดไฟล์ทั้งหมดสำหรับแต่ละกลุ่ม

คุณสามารถทำได้ใน Marcel ดังนี้:

ตัวดำเนินการ ls จะสร้างสตรีมของอ็อบเจ็กต์ File (-fr หมายถึงการเยี่ยมชมไดเร็กทอรีแบบวนซ้ำ และส่งคืนเฉพาะไฟล์)

ออบเจ็กต์ ไฟล์ ถูกส่งไปยังคำสั่งถัดไป ซึ่งก็คือ แมป แผนที่ ระบุฟังก์ชัน Python ในวงเล็บด้านนอกสุด ซึ่งจะจับคู่แต่ละไฟล์กับทูเพิลที่มีนามสกุลของไฟล์และขนาดของไฟล์ (Marcel อนุญาตให้ละเว้นคำหลัก lambda ได้)

ตัวดำเนินการ สีแดง (ลด) จัดกลุ่มตามส่วนแรกของทูเพิล (ส่วนขยาย) แล้วสรุปขนาดภายในแต่ละกลุ่ม ผลลัพธ์จะถูกจัดเรียงตามส่วนขยาย

โฮสต์ปฏิบัติการและ Marcel Pipeline

ไปป์ไลน์ อาจมีส่วนผสมของตัวดำเนินการ 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

อาร์กิวเมนต์ที่อยู่ในวงเล็บสำหรับแมปคือฟังก์ชัน Python ที่แยกบรรทัดที่ตัวคั่น : ซึ่งได้ผลลัพธ์ 7 สิ่งอันดับ select คือตัวดำเนินการ Marcel ซึ่งมีอาร์กิวเมนต์เป็นฟังก์ชัน Python ที่ระบุสิ่งอันดับต่างๆ โดยที่ฟิลด์สุดท้ายคือ /bin/bash

ตัวดำเนินการถัดไป แผนที่อื่นจะเก็บฟิลด์ชื่อผู้ใช้ของแต่ละอินพุตทูเพิล สุดท้าย xargs echo จะรวมชื่อผู้ใช้ที่เข้ามาเป็นบรรทัดเดียว ซึ่งพิมพ์ไปที่ stdout

การเขียนสคริปต์ใน Marcel Shell

แม้ว่าบางครั้ง Python จะถือว่าเป็นภาษาสคริปต์ แต่จริงๆ แล้วมันไม่ได้ผลดีนักสำหรับจุดประสงค์นั้น ปัญหาคือการรันคำสั่งเชลล์และไฟล์ปฏิบัติการอื่น ๆ จาก 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 เพื่อให้สามารถใช้กับคำสั่งของ Python สำหรับลูปได้

การเข้าถึงฐานข้อมูลด้วย Marcel Shell

คุณสามารถรวมการเข้าถึงฐานข้อมูลเข้ากับไปป์ไลน์ของ Marcel ได้ ขั้นแรก คุณต้องกำหนดค่าการเข้าถึงฐานข้อมูลในไฟล์กำหนดค่า ~/.marcel.py เช่น

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

DB_DEFAULT = 'jao'

ซึ่งจะกำหนดค่าการเข้าถึงฐานข้อมูล Postgres ชื่อ acme โดยใช้ไดรเวอร์ psycopg2 การเชื่อมต่อจาก Marcel จะทำโดยใช้ผู้ใช้ jao และโปรไฟล์ฐานข้อมูลชื่อ jao (DB_DEFAULT ระบุโปรไฟล์ฐานข้อมูล jao เป็นโปรไฟล์ที่จะใช้หากไม่มีการระบุโปรไฟล์) เมื่อกำหนดค่าเสร็จแล้ว ขณะนี้สามารถสืบค้นฐานข้อมูลได้โดยใช้ตัวดำเนินการ sql เช่น

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

คำสั่งนี้จะสอบถามตารางชื่อ ส่วน และทิ้งผลลัพธ์การสืบค้นลงในไฟล์ ~/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'])

คลัสเตอร์สามารถระบุได้ว่าเป็น ห้องปฏิบัติการ ในคำสั่ง Marcel พารามิเตอร์ผู้ใช้และข้อมูลประจำตัวระบุข้อมูลการเข้าสู่ระบบ และพารามิเตอร์ โฮสต์ ระบุที่อยู่ IP ของโหนดบนคลัสเตอร์

เมื่อกำหนดค่าคลัสเตอร์แล้ว โหนดทั้งหมดจะสามารถดำเนินการได้ในคราวเดียว ตัวอย่างเช่น หากต้องการรับรายการกระบวนการ pids และบรรทัดคำสั่งทั่วทั้งคลัสเตอร์:

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

สิ่งนี้จะส่งคืนสตรีมของสิ่งอันดับ (ที่อยู่ IP, PID, บรรทัดคำสั่ง)

สำหรับข้อมูลเพิ่มเติม โปรดไปที่:

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

Marcel ยังค่อนข้างใหม่และอยู่ระหว่างการพัฒนา ติดต่อหากคุณต้องการความช่วยเหลือ