Marcel - Linux için Daha Modern Bir Kabuk


Marcel yeni bir kabuktur. Birçok yönden geleneksel kabuklara benzer, ancak birkaç şeyi farklı yapar:

  • Borulama: Tüm kabuklar, bir komutun çıktısından diğerinin girişine metin göndermek için boruları kullanır. Marcel dizeler yerine yapılandırılmış verileri kullanıyor.
  • Python: Marcel, Python'da uygulanır ve Python'u çeşitli şekillerde kullanıma sunar. Komutlarınızda biraz mantığa ihtiyacınız varsa Marcel bunu Python'da ifade etmenize olanak sağlar.
  • Komut Dosyası Oluşturma: Marcel, komut dosyası yazmaya alışılmadık bir yaklaşım getiriyor. Elbette bir metin dosyasına bir dizi marcel komutu yazıp bunları çalıştırabilirsiniz. Ancak Marcel ayrıca Python modülü biçiminde bir API de sağlıyor. Python betiklerini düz Python ile mümkün olandan çok daha rahat bir şekilde yapmak için bu modülü içe aktarabilirsiniz.

Marcel, GPLv3 kapsamında lisanslıdır.

Marcel Modern Shell'in Linux'a Kurulumu

Marcel, Python 3.6 veya üstünü gerektirir. Linux'ta geliştirilmiş ve test edilmiştir ve çoğunlukla macOS'te çalışır. (Windows'a geçiş konusunda yardımcı olmak veya macOS eksikliklerini gidermek istiyorsanız bizimle iletişime geçin.)

Marcel'i kendi kullanımınız amacıyla yüklemek için:

python3 -m pip install marcel

Veya tüm kullanıcılar için kurulum yapmak istiyorsanız (örn. /usr/local'a):

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

marcel'i yükledikten sonra, marcel komutunu çalıştırarak çalışıp çalışmadığını kontrol edin ve ardından marcel isteminde sürümünü çalıştırın komutu:

marcel

Marcel Shell'in özelleştirilmesi

Başlangıçta okunan (ve değiştirildiğinde yeniden okunan) ~/.marcel.py dosyasında marcel'i özelleştirebilirsiniz. Dosya adından da anlaşılabileceği gibi Marcel'in özelleştirmesi Python'da yapılıyor.

Muhtemelen yapmak isteyeceğiniz şeylerden biri istemi özelleştirmektir. Bunu yapmak için PROMPT değişkenine bir liste atarsınız. Örneğin, isteminizin geçerli dizin olmasını, yeşil renkte ve ardından mavi renkte > ile yazdırılmasını istiyorsanız:

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

Ortaya çıkan istem şuna benzer:

Bu, bash'ta yapmanız gereken anlaşılmaz PS1 yapılandırmasının yerini alır. Renk(0, 4, 0) yeşil'i belirtir (bağımsız değişkenler 0-5 aralığındaki RGB değerleridir) güçlü>). PWD, geçerli dizininizi temsil eden ortam değişkenidir ve bu değişkenin başına lambda: eklenmesi, istemin her görüntülendiğinde değerlendirilen bir işlev oluşturur.

~/.marcel.py ayrıca Python modüllerini de içe aktarabilir. Örneğin, matematik modülünün işlevlerini marcel komutlarınızda kullanmak istiyorsanız:

from math import *

Bunu yaptıktan sonra o modüldeki sembollere başvurabilirsiniz; pi:

pi'nin parantez içine alındığını unutmayın. Genel olarak marcel, Python ifadelerini sınırlamak için parantezleri kullanır. Yani (pi), pi değişkeninin değerini alan Python ifadesini değerlendirir. Geleneksel ortam değişkenlerine de bu şekilde erişebilirsiniz; (USER) ve (HOME) veya marcel'in ad alanındaki sembollere dayanan herhangi bir geçerli Python ifadesi.

Ve elbette kendi sembollerinizi de tanımlayabilirsiniz. Örneğin, bu işlev tanımını ~/.marcel.py içine koyarsanız:

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

o zaman komut satırında faktöriyel fonksiyonunu kullanabilirsiniz, ör.

Marcel Kabuk Örnekleri

Burada Marcel kabuğundaki bazı komut örneklerini öğreneceğiz.

Uzantıya Göre Dosya Boyutlarını Bul

Geçerli dizini yinelemeli olarak keşfedin, dosyaları uzantılarına göre gruplandırın (örneğin, .txt, .py vb.) ve her grup için toplam dosya boyutunu hesaplayın.

Bunu Marcel'de şu şekilde yapabilirsiniz:

ls operatörü, Dosya nesnelerinin bir akışını üretir (-fr, dizinleri yinelemeli olarak ziyaret etmek ve yalnızca dosyaları döndürmek anlamına gelir).

Dosya nesneleri bir sonraki komut olan haritaya aktarılır. Harita, en dıştaki parantez içinde, her dosyayı dosyanın uzantısını ve boyutunu içeren bir demet ile eşleştiren bir Python işlevini belirtir. (Marcel lambda anahtar sözcüğünün atlanmasına izin verir.)

Kırmızı (küçültme) operatörü, demetin ilk kısmına (uzantı) göre gruplandırır ve ardından her grup içindeki boyutları toplar. Sonuç uzantıya göre sıralanır.

Yürütülebilir Dosyaları Barındırın ve Marcel Pipeline

Ardışık düzen, Marcel operatörleri ve ana bilgisayar yürütülebilir dosyalarının bir karışımını içerebilir. Operatörler nesneleri yönlendirir, ancak operatör/yürütülebilir sınırlarda bunun yerine Marcel dizeleri yönlendirir.

Örneğin, bu komut operatörleri ve yürütülebilir dosyaları birleştirir ve kabuğu /bin/bash olan kullanıcıların kullanıcı adlarını listeler.

cat /etc/passwd \
| map (line: line.split(':')) \
| select (*line: line[-1] == '/bin/bash') \
| map (*line: line[0]) \
| xargs echo

cat bir Linux yürütülebilir dosyasıdır. /etc/passwd okur ve Marcel, içeriğini aşağıya doğru Marcel operatör haritasına aktarır.

Map'in parantez içindeki argümanı, satırları : ayırıcılarında bölerek 7'li demetler veren bir Python işlevidir. select, argümanı, son alanı /bin/bash olan demetleri tanımlayan bir Python işlevi olan bir Marcel operatörüdür.

Bir sonraki operatör, başka bir harita, her giriş grubunun kullanıcı adı alanını tutar. Son olarak xargs echo, gelen kullanıcı adlarını tek bir satırda birleştirir ve bu, stdout'a yazdırılır.

Marcel Shell'de Komut Dosyası Yazma

Python bazen bir kodlama dili olarak düşünülse de aslında bu amaç için pek işe yaramaz. Sorun, kabuk komutlarını ve diğer yürütülebilir dosyaları Python'dan çalıştırmanın zahmetli olmasıdır. Basit ama çoğu zaman stdin, stdout ve stderr ile uğraşmak için yetersiz olan os.system() komutunu kullanabilirsiniz. subprocess.Popen() daha güçlüdür ancak kullanımı daha karmaşıktır.

Marcel'in yaklaşımı, Marcel operatörlerini Python'un dil özellikleriyle bütünleştiren bir modül sağlamaktır. Daha önceki bir örneği tekrar gözden geçirmek için, dosya boyutlarının toplamını uzantıya göre hesaplamak için Python kodunu burada bulabilirsiniz:

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

Kabuk komutları, sözdizimsel kurallar dışında öncekiyle aynıdır. Böylece ls -fr, ls(file=True, recursive=True)'ye dönüşür. Kabuk versiyonunda olduğu gibi harita ve kırmızı operatörler de borularla bağlantılıdır. Kabuk komutunun tamamı (ls … red) bir Python yineleyicisi sağlar, böylece komut Python'un for döngüsüyle birlikte kullanılabilir.

Marcel Shell ile Veritabanı Erişimi

Veritabanı erişimini Marcel işlem hatlarıyla entegre edebilirsiniz. İlk olarak, ~/.marcel.py yapılandırma dosyasında veritabanı erişimini yapılandırmanız gerekir, ör.

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

DB_DEFAULT = 'jao'

Bu, psycopg2 sürücüsünü kullanarak acme adlı Postgres veritabanına erişimi yapılandırır. Marcel'den gelen bağlantılar jao kullanıcısı kullanılarak yapılacak ve veritabanı profili jao olarak adlandırılacak. (DB_DEFAULT, herhangi bir profil belirtilmemişse kullanılacak profil olarak jao veritabanı profilini belirtir.) Bu yapılandırma tamamlandığında, veritabanı artık sql operatörü kullanılarak sorgulanabilir;

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

Bu komut, part adlı bir tabloyu sorgular ve sorgu sonucunu CSV biçiminde ~/reorder.csv dosyasına aktarır.

Marcel Shell ile Uzaktan Erişim

Veritabanı erişimine benzer şekilde, uzaktan erişim de ~/.marcel.py'da yapılandırılabilir. Örneğin, bu 4 düğümlü bir kümeyi yapılandırır:

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

Küme, Marcel komutlarında laboratuvar olarak tanımlanabilir. Kullanıcı ve kimlik parametreleri oturum açma bilgilerini belirtir ve ana bilgisayar parametresi kümedeki düğümlerin IP adreslerini belirtir.

Küme yapılandırıldıktan sonra tüm düğümler aynı anda çalıştırılabilir. Örneğin, kümedeki işlem pid'lerinin ve komut satırlarının bir listesini almak için:

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

Bu, (IP adresi, PID, komut satırı) tuple akışını döndürür.

Daha fazla bilgi için şu adresi ziyaret edin:

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

Marcel oldukça yeni ve aktif olarak geliştirilme aşamasında. Yardım etmek istiyorsanız iletişime geçin.