Marcel - Shell ọgbara ọhụrụ maka Linux


Marcel bụ shei ọhụrụ. Ọ dị ka shells ọdịnala n'ọtụtụ ụzọ, mana ọ na-eme ihe ole na ole n'ụzọ dị iche:

  • Piping: shells niile na-eji ọkpọkọ zipu ederede site na mmepụta nke otu iwu gaa na ntinye nke ọzọ. Marcel ọkpọkọ ahaziri data kama eriri.
  • Python: A na-emejuputa Marcel na Python, ma na-ekpughe Python n'ọtụtụ ụzọ. Ọ bụrụ na ịchọrọ ntakịrị mgbagha n'iwu gị, marcel na-enye gị ohere igosipụta ya na Python.
  • Scripting: Marcel na-eji ụzọ pụrụ iche maka ide edemede. Ị nwere ike, n'ezie, dee naanị usoro iwu marcel n'ime faịlụ ederede wee gbuo ha. Mana Marcel na-enyekwa API n'ụdị modul Python. Ị nwere ike ibubata modul a iji mee scripting Python n'ụzọ dị mma karịa ka enwere ike iji Python larịị.

Marcel nwere ikike n'okpuru GPLv3.

Ịwụnye Marcel Modern Shell na Linux

Marcel chọrọ Python 3.6 ma ọ bụ karịa. Emepụtara ya ma nwalee ya na Linux, ọ na-arụkwa ọrụ na macOS. (Ọ bụrụ na ị ga-achọ inye aka na ọdụ ụgbọ mmiri na Windows, ma ọ bụ dozie adịghị ike macOS, kpọtụrụ.)

Iji tinye marcel maka ojiji nke gị:

# python3 -m pip install marcel

Ma ọ bụ ọ bụrụ na ịchọrọ ịwụnye maka ndị ọrụ niile (dịka, na /usr/local):

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

Ozugbo ị wụnye marcel, lelee na ọ na-arụ ọrụ site na iji iwu marcel, wee na marcel ozugbo, mee iwu ụdị:

$ marcel

Nhazi nke Marcel Shell

Ị nwere ike hazie marcel na faịlụ ~/.marcel.py, nke a na-agụ na mmalite, (ma na-agụgharị mgbe emegharịrị). Dị ka ị nwere ike ịkọ site na aha faịlụ ahụ, a na-eme nhazi nke marcel na Python.

Otu ihe ị ga-achọ ime bụ ịhazi ngwa ngwa. Iji mee nke a, ị na-ekenye ndepụta na mgbanwe PROMPT. Dịka ọmụmaatụ, ọ bụrụ na ịchọrọ ka ngwa ngwa gị bụrụ akwụkwọ ndekọ aha ugbu a, nke ebipụtara na akwụkwọ ndụ akwụkwọ ndụ, nke > sochiri ya na-acha anụnụ anụnụ:

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

Mkpesa nke pụta dị ka nke a:

Nke a nọchiri nhazi PS1 enweghị ike ịkọwa nke ị ga-achọ ime na bash. Agba (0, 4, 0) na-akọwapụta akwụkwọ ndụ akwụkwọ ndụ, (arụmụka ndị a bụ ụkpụrụ RGB, na oke 0-5). PWD bụ mgbanwe gburugburu ebe obibi na-anọchi anya akwụkwọ ndekọ aha gị ugbu a yana prefixing a variable with lambda: na-ewepụta ọrụ, na-enyocha oge ọ bụla egosipụtara ozugbo.

~/.marcel.py nwekwara ike ibubata modul Python. Dịka ọmụmaatụ, ọ bụrụ na ịchọrọ iji ọrụ nke modul mgbakọ na mwepụ na iwu marcel gị:

from math import *

Ozugbo ịmechara nke a, ị nwere ike ịtu aka na akara sitere na modul ahụ, dịka. pi:

Rịba ama na pi bụ akpaaka. N'izugbe, marcel na-eji akara aka iji kpachapụ okwu Python. Ya mere (pi) na-enyocha okwu Python nke na-eweghachite uru nke mgbanwe pi. Ị nwekwara ike ịnweta mgbanwe gburugburu ebe obibi ọdịnala n'ụzọ dị otú a, dịka. (USER) na (Ụlọ), ma ọ bụ okwu Python ọ bụla bara uru na-adabere na akara na ebe aha marcel.

Ma ị nwere ike, n'ezie, kọwaa akara nke gị. Dịka ọmụmaatụ, ọ bụrụ na itinye nkọwa ọrụ a na ~/.marcel.py:

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

mgbe ahụ ị nwere ike iji ọrụ mmepụta ihe na ahịrị iwu, dịka.

Ihe Nlereanya Marcel Shell

N'ebe a, anyị ga-amụta ụfọdụ ọmụmaatụ nke iwu na shei marcel.

Chọgharịa ndekọ ndekọ ugbu a ugboro ugboro, chịkọta faịlụ ndị ahụ site na ndọtị ha (dịka .txt, .py na ihe ndị ọzọ), wee gbakọọ mkpokọta faịlụ maka otu ọ bụla.

Ị nwere ike ime nke a na marcel dị ka ndị a:

Onye na-arụ ọrụ ls na-emepụta iyi faịlụ ihe, (-fr pụtara nleta akwụkwọ ndekọ aha ugboro ugboro, ma weghachi naanị faịlụ).

A na-atụnye ihe faịlụ ahụ na iwu na-esote, maapụ. Maapụ ahụ na-akọwapụta ọrụ Eke Ọgba, n'ime akara aka kacha elu, nke na-esetịpụ faịlụ ọ bụla na tuple nwere ndọtị faịlụ ahụ, yana nha ya. (Marcel na-enye ohere ịhapụ mkpụrụokwu lambda.)

Onye ọrụ na-acha uhie uhie (belata), otu site na akụkụ mbụ nke tuple (mgbatị) wee chịkọta nha n'ime otu ọ bụla. A na-ahazi nsonaazụ ya site na ndọtị.

Pipeline nwere ike ịnwe ngwakọta nke ndị na-arụ ọrụ marcel na ndị ọrụ executable. Ndị na-arụ ọrụ ọkpọkọ ihe, mana n'ókè ndị ọrụ/executable, marcel pipes strings kama.

Dịka ọmụmaatụ, iwu a na-ejikọta ndị na-arụ ọrụ na ndị executables wee depụta aha njirimara nke ndị ọrụ nke shei ha bụ /bin/bash.

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

cat bụ Linux executable. Ọ na-agụ /etc/passwd, ma marcel na-ebufe ọdịnaya ya na maapụ onye ọrụ marcel.

Arụmụka a kpọkọtara ọnụ na eserese ngosi bụ ọrụ Python na-ekewa ahịrị na : separators, na-enye 7-tuples. Nhọrọ bụ onye na-arụ ọrụ marcel nke arụmụka ya bụ ọrụ Python na-akọwapụta tuples nke mpaghara ikpeazụ bụ/bin/bash.

Onye ọrụ na-esote, maapụ ọzọ na-edobe mpaghara aha njirimara nke ntinye ntinye ọ bụla. N'ikpeazụ, xargs echo na-ejikọta aha njirimara na-abata n'ime otu ahịrị, nke a na-ebipụta na stdout.

Edemede na Marcel Shell

Ọ bụ ezie na a na-ewere Python mgbe ụfọdụ ka ọ bụ asụsụ ederede, ọ naghị arụ ọrụ nke ọma maka ebumnuche ahụ. Nsogbu bụ na ị na-agba ọsọ iwu shei, yana ndị ọzọ executables si Python dị egwu. Ị nwere ike iji os.system(), nke dị mfe ma na-adịkarịghị ezuru maka imeso stdin, stdout na stderr. subprocess.Popen() dị ike karịa mana ọ siri ike iji.

Ụzọ Marcel bụ ịnye modul na-ejikọta ndị na-arụ ọrụ marcel na njirimara asụsụ Python. Iji letagharịa ihe atụ mbụ, nke a bụ koodu Python maka ịgbakọ mkpokọta nha faịlụ site na ndọtị:

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

Iwu shei dị ka ọ dị na mbụ, belụsọ maka mgbakọ syntactic. Ya mere ls -fr na-atụgharị ghọọ ls(file=True, recursive=True). Maapụ na ndị ọrụ na-acha uhie uhie dịkwa ebe ahụ, jikọtara ya na ọkpọkọ, dịka ọ dị na ụdị shei. Iwu shei dum (ls… red) na-ewepụta Python iterator ka enwere ike iji iwu ahụ na Python's maka loop.

Nweta nchekwa data na Marcel Shell

Ị nwere ike ijikọ ohere nchekwa data na marcel pipeline. Mbụ, ịkwesịrị ịhazi ohere nchekwa data na faịlụ nhazi, ~/.marcel.py, dịka ọmụmaatụ.

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

DB_DEFAULT = 'jao'

Nke a na-ahazi ohere ịnweta nchekwa data Postgres aha ya bụ acme, na-eji onye ọkwọ ụgbọ ala psycopg2. A ga-eme njikọ sitere na marcel site na iji onye ọrụ jao, a na-akpọ profaịlụ nchekwa data jao. (DB_DEFAULT na-akọwapụta profaịlụ nchekwa data jao dị ka nke a ga-eji ma ọ bụrụ na enweghị profaịlụ akọwapụtara.) Site na nhazi a, enwere ike jụọ nchekwa data site na iji onye ọrụ sql, dịka ọmụmaatụ.

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

Iwu a na-ajụ ajụjụ tebụl akpọrọ akụkụ, wee tụfuo nsonaazụ ajụjụ n'ime faịlụ ~/reorder.csv, n'ụdị CSV.

Nweta ime anya na Marcel Shell

N'otu aka ahụ na ịnweta nchekwa data, enwere ike ịhazi ohere ime ime na ~/.marcel.py. Dịka ọmụmaatụ, nke a na-ahazi ụyọkọ ọnụ ọnụ 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'])

Enwere ike ịmata ụyọkọ ahụ dị ka ụlọ nyocha na iwu marcel. Onye ọrụ na paramita njirimara na-akọwapụta ozi nbanye, na oke nnabata na-akọwapụta adreesị IP nke ọnụ ọnụ na ụyọkọ ahụ.

Ozugbo ahaziri ụyọkọ ahụ, enwere ike ịwa ọnụ ọnụ niile ozugbo. Dịka ọmụmaatụ, iji nweta ndepụta pids usoro na ahịrị iwu gafee ụyọkọ ahụ:

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

Nke a na-eweghachite iyi nke (adreesị IP, PID, ahịrị iwu) tuples.

Maka ozi ndị ọzọ, gaa na:

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

Marcel dị ọhụrụ ma na-arụsi ọrụ ike. Kpọtụrụ ma ọ bụrụ na ị ga-achọ inye aka.