มาร์เซล เป็นเปลือกใหม่ มันคล้ายกับเปลือกหอยแบบดั้งเดิมในหลาย ๆ ด้าน แต่มีบางสิ่งที่แตกต่างออกไป:
- วางท่อ :เชลล์ทั้งหมดใช้ไพพ์เพื่อส่งข้อความจากเอาต์พุตของคำสั่งหนึ่งไปยังอินพุตของคำสั่งอื่น Marcel ไปป์ข้อมูลที่มีโครงสร้างแทนที่จะเป็นสตริง
- หลาม :Marcel ถูกนำไปใช้ใน Python และเปิดเผย Python ได้หลายวิธี หากคุณต้องการตรรกะเล็กน้อยในคำสั่งของคุณ Marcel อนุญาตให้คุณแสดงออกใน Python
- การเขียนสคริปต์ :Marcel ใช้แนวทางที่ไม่ธรรมดาในการเขียนสคริปต์ แน่นอน คุณสามารถเขียนลำดับของคำสั่ง marcel ในไฟล์ข้อความและดำเนินการได้ แต่ Marcel ยังมี API ในรูปแบบของโมดูล Python คุณสามารถนำเข้าโมดูลนี้เพื่อทำการเขียนสคริปต์ Python ด้วยวิธีที่สะดวกกว่าที่ทำกับ Python ธรรมดาได้มาก
มาร์เซล ได้รับอนุญาตภายใต้ 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 ให้เรียกใช้ เวอร์ชัน คำสั่ง:
$ marcel
การปรับแต่ง Marcel Shell
คุณสามารถปรับแต่ง marcel ในไฟล์ ~/.marcel.py
ซึ่งอ่านเมื่อเริ่มต้น (และอ่านซ้ำเมื่อแก้ไข) อย่างที่คุณทราบจากชื่อไฟล์ การปรับแต่ง marcel ทำได้ใน Python
สิ่งหนึ่งที่คุณอาจต้องการทำคือปรับแต่งพรอมต์ ในการดำเนินการนี้ คุณกำหนดรายการให้กับ PROMPT ตัวแปร. ตัวอย่างเช่น หากคุณต้องการให้พรอมต์ของคุณเป็นไดเร็กทอรีปัจจุบัน พิมพ์เป็นสีเขียว ตามด้วย >
พิมพ์เป็นสีน้ำเงิน:
PROMPT = [ Color(0, 4, 0), lambda: PWD, Color(0, 2, 5), '> ' ]
พรอมต์ผลลัพธ์จะมีลักษณะดังนี้:
สิ่งนี้แทนที่ PS1
. ที่ไม่น่าเชื่อถือ การกำหนดค่าที่คุณต้องทำในทุบตี สี(0, 4, 0) ระบุ สีเขียว , (อาร์กิวเมนต์คือ RGB ค่าในช่วง 0-5 ). PWD เป็นตัวแปรสภาพแวดล้อมที่แสดงถึงไดเร็กทอรีปัจจุบันของคุณและนำหน้าตัวแปรนี้ด้วย lambda:
สร้างฟังก์ชัน ประเมินทุกครั้งที่มีการแสดงข้อความแจ้ง
~/.marcel.py
ยังสามารถนำเข้าโมดูล Python เช่น หากคุณต้องการใช้ฟังก์ชันของโมดูลคณิตศาสตร์ในคำสั่ง marcel:
from math import *
เมื่อคุณทำเสร็จแล้ว คุณสามารถอ้างถึงสัญลักษณ์จากโมดูลนั้นได้ เช่น pi
:
โปรดทราบว่า pi
อยู่ในวงเล็บ โดยทั่วไป มาร์เซล ใช้วงเล็บเพื่อคั่นนิพจน์ Python ดังนั้น (pi)
ประเมินนิพจน์ Python ที่ดึงค่าของตัวแปร pi . คุณยังสามารถเข้าถึงตัวแปรสภาพแวดล้อมแบบดั้งเดิมได้ด้วยวิธีนี้ เช่น (USER) และ (หน้าแรก) หรือนิพจน์ Python ที่ถูกต้องโดยอาศัยสัญลักษณ์ในเนมสเปซของ marcel
และแน่นอน คุณสามารถกำหนดสัญลักษณ์ของคุณเองได้ ตัวอย่างเช่น หากคุณใส่คำจำกัดความของฟังก์ชันนี้ใน ~/.marcel.py
:
def factorial(n): f = 1 for i in range(1, n + 1): f *= i return f
คุณสามารถใช้ฟังก์ชันแฟกทอเรียลบนบรรทัดคำสั่งได้ เช่น
ตัวอย่าง Marcel Shell
ในที่นี้ เราจะมาเรียนรู้ตัวอย่างคำสั่งบางส่วนใน Marcel Shell
ค้นหาขนาดไฟล์ตามนามสกุล
สำรวจไดเรกทอรีปัจจุบันซ้ำๆ จัดกลุ่มไฟล์ตามนามสกุล (เช่น .txt
, .py
เป็นต้น) และคำนวณขนาดไฟล์ทั้งหมดสำหรับแต่ละกลุ่ม
คุณสามารถทำได้ใน marcel ดังนี้:
ตัวดำเนินการ ls สร้างสตรีมของวัตถุไฟล์ (-fr
หมายถึงไปที่ไดเร็กทอรีแบบเรียกซ้ำและส่งคืนเฉพาะไฟล์)
ไฟล์ ออบเจ็กต์ถูกส่งไปยังคำสั่งถัดไป map แผนที่ ระบุฟังก์ชัน Python ในวงเล็บนอกสุด ซึ่งแมปแต่ละไฟล์กับทูเพิลที่มีนามสกุลไฟล์ และขนาดของไฟล์ (Marcel อนุญาตให้ละเว้นคำหลักแลมบ์ดา)
สีแดง (ลด) โอเปอเรเตอร์ จัดกลุ่มตามส่วนแรกของทูเปิล (ส่วนขยาย ) แล้วสรุปขนาดภายในแต่ละกลุ่ม ผลลัพธ์จะถูกจัดเรียงตามนามสกุล
โฮสต์ปฏิบัติการและ Marcel Pipeline
ท่อ อาจมีส่วนผสมของตัวดำเนินการ marcel และโปรแกรมปฏิบัติการของโฮสต์ โอเปอเรเตอร์ไพพ์ออบเจ็กต์ แต่ที่โอเปอเรเตอร์/ขอบเขตที่เรียกใช้งานได้ มาร์เซลไพพ์สตริงแทน
ตัวอย่างเช่น คำสั่งนี้รวมโอเปอเรเตอร์และไฟล์เรียกทำงาน และแสดงรายการชื่อผู้ใช้ของผู้ใช้ที่มีเชลล์เป็น /bin/bash
.
$ cat /etc/passwd \ | map (line: line.split(':')) \ | select (*line: line[-1] == '/bin/bash') \ | map (*line: line[0]) \ | xargs echo
cat เป็นไฟล์ปฏิบัติการลินุกซ์ มันอ่านว่า /etc/passwd และมาร์เซลวางเนื้อหาในส่วนท้ายน้ำไปยังแมปโอเปอเรเตอร์มาร์เซล
อาร์กิวเมนต์ในวงเล็บเพื่อแมปเป็นฟังก์ชัน Python ที่แยกบรรทัดที่ :
ตัวคั่นให้ผล 7-tuples เลือก เป็นโอเปอเรเตอร์ marcel ที่มีอาร์กิวเมนต์เป็นฟังก์ชัน Python ที่ระบุ tuples ซึ่งฟิลด์สุดท้ายคือ /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 … สีแดง) ให้ Python iterator เพื่อให้สามารถใช้คำสั่งกับ Python สำหรับการวนซ้ำได้
การเข้าถึงฐานข้อมูลด้วย Marcel Shell
คุณสามารถรวมการเข้าถึงฐานข้อมูลกับไพพ์ไลน์มาร์เซล ขั้นแรก คุณต้องกำหนดค่าการเข้าถึงฐานข้อมูลในไฟล์ปรับแต่ง ~/.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'])
คลัสเตอร์สามารถระบุได้ว่าเป็น แล็บ ในคำสั่งมาร์เซล พารามิเตอร์ผู้ใช้และข้อมูลประจำตัวระบุข้อมูลการเข้าสู่ระบบ และ โฮสต์ พารามิเตอร์ระบุที่อยู่ IP ของโหนดบนคลัสเตอร์
เมื่อกำหนดค่าคลัสเตอร์แล้ว โหนดทั้งหมดจะทำงานพร้อมกันได้ ตัวอย่างเช่น เพื่อรับรายการกระบวนการ pids และบรรทัดคำสั่งทั่วทั้งคลัสเตอร์:
@lab [ps | map (proc: (proc.pid, proc.commandline))]
ส่งคืนสตรีมของ (ที่อยู่ IP, PID, บรรทัดคำสั่ง) ทูเพิล
สำหรับข้อมูลเพิ่มเติม โปรดไปที่:
- https://www.marceltheshell.org/
- https://github.com/geophile/marcel
มาร์เซล ค่อนข้างใหม่และอยู่ระหว่างการพัฒนา ติดต่อหากคุณต้องการความช่วยเหลือ