סקוניל רובע רתוי תינרדומ תפטעמ - לסרמ


:תרחא םירבד המכ השוע אוה לבא ,םיבר םינבומב תויתרוסמ תופילקל המוד הז .השדח הפילק אוה לסרמ

    .GPLv3 תחת השרומ לסרמ

    סקונילב Marcel Modern Shell תנקתה

    (.רשק רוצ ,MacOS -ב םייוקילה תא ןקתל וא תונולחל ריבעהל רוזעל ךנוצרב םא) .macOS לע רקיעב דבוע אוהו ,סקוניל לע קדבנו חתופ הז .ךליאו 3.6 ןותייפ שרוד לסרמ

    :ישיאה ךשומישל marcel תא ןיקתהל ידכ

    # python3 -m pip install marcel
    

    :(/usr/local ,לשמל) םישמתשמה לכ רובע ןיקתהל ךנוצרב םא ,ןיפולחל

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

    :הסרגה תדוקפ תא לעפה ,marcel תייחנהב זאו הדוקפה marcel תלעפה ידי לע לעופ אוהש קודב ,marcel תא תנקתהש רחאל

    $ marcel
    

    תפטעמ לסרמ לש תישיא המאתה

    .ןותייפב תישענ marcel לש תישיאה המאתהה ,ץבוקה םשמ תעדל ןתינש יפכ .(ויוניש רחאל שדחמ ותוא אורקלו) ,הלעפהה תעב ארקנה , ~/.marcel.py ץבוקב marcel -ה תא תישיא םיאתהל ןתינ

    :לוחכב תספדומ > הירחאו ,קוריב תספדומ ,תיחכונה הירפסה היהת ךלש היחנההש ךנוצרב םא ,המגודל .PROMPT הנתשמל המישר הצקמ התא ,ךכ םשל .היחנהה תא תישיא םיאתהל אוה תושעל הצור חטב התאש

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

    :ךכ תיארנ תלבקתמה הדוקפה

    .תגצומ היחנההש םעפ לכב תכרעומה ,היצקנופ תרציימ lambda: םע הז הנתשמל תמודיקו ךלש תיחכונה הירפסה תא גציימה הביבסה הנתשמ אוה PWD .(0-5 חווטב ,RGB יכרע םה םינועיטה) ,קורי ןייצמ

    :ךלש marcel -ה תודוקפב הקיטמתמה לודומ לש תויצקנופב שמתשהל ךנוצרב םא ,המגודל .Python ילודומ אבייל םג לוכי ~/.marcel.py ה

    from math import *
    

    : pi .לשמל ,לודומ ותואמ םילמסל סחייתהל לכות ,תאז השעתש רחאל

    .marcel לש תומשה בחרמב םילמס לע ךמתסמה ףקת ןותיפ יוטיב לכ וא ,(HOME) -ו (USER) .לשמל ,וז ךרדב םייתרוסמ הביבס ינתשמל תשגל םג ןתינ .pi הנתשמה ךרע תא רזחאמה Python -ה יוטיב תא ךירעמ (p

    : ~/.marcel.py ל וזה היצקנופה תרדגה תא םש התא םא ,המגודל .ךלש םילמסה תא רידגהל ,ןבומכ ,לוכי התאו

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

    .לשמל ,הדוקפה תרושב תילאירוטקפה היצקנופב שמתשהל לוכי התא זא

    תפטעמ לסרמ לש תואמגוד

    .marcel -ה תפטעמב תודוקפל תואמגוד המכ דמלנ ןאכ

    .הצובק לכ רובע ללוכה ץבוקה לדוג תא בשחו ,(האלה ןכו .txt , .py לשמל) םהלש תמויסה יפל םיצבקה תא ץביק ,יביסרוקר ןפואב תיחכונה הירפסה תא רוקח

    :אבה ןפואב marcel -ב תאז תושעל לוכי התא

    .(םיצבק קר ריזחהלו ,תיביסרוקר תוירפסב רקבל ושוריפ -fr ) ,םיצבק לש םיטקייבוא לש םרז רציימ ls ליעפמ

    .(הדבמל חתפמה תלימ תא טימשהל רשפאמ לסרמ) .ולדוגו ,ץבוקה תמויס תא ליכמה לפוטל ץבוק לכ הפממה ,רתויב םיינוציחה םיירגוסב ,ןותיפ תייצקנופ תנייצמ הפמה .הפמה ,אבה רוניצל םירבעומ ץבוק םיטקייבוא

    .הבחרה יפל תניוממ האצותה .הצובק לכ ךותב םילדגה תא םכסמ זאו (הבחרה) לפוטה לש ןושארה קלחה יפל ץבקמ ,(תיחפהל) םודאה רוטרפואה

    .םוקמב םירתימ לסראמ תורוניצ ,הלעפהה/ליעפמה תולובגב ךא ,םיליעפמ רוניצ יליעפמ .םיחראמ הלעפה ילהנמו לסרמ יליעפמ לש תבורעת ליכהל םייושע תורוניצ

    ./bin/bash םתפילקלש םישמתשמה תומש תא תטרפמו הלעפהו םירוטרפוא תבלשמ וז הדוקפ ,אמגודל

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

    .לסראמה ליעפמ תפמל םרזה דרומב ונכות תא תרנצמ לסרמו ,etc/passwd/ארוק אוה .סקוניל לש הלעפה אוה לותח

    .bin/bash/אוה ןורחאה הדשה םהב הדשה תורמצ םתוא תא ההזמה ןותייפ תייצקנופ אוה ולש ןועיטהש סקראמ ליעפמ אוה טקלס .תופכ 7 הבינמו ,: ידירפמב תורושה תא תלצפמה ןותיפ תייצקנופ אוה

    .stdout ל תספדומ רשא ,תחא הרושל םיסנכנה םישמתשמה תומש תא בלשמ xargs דה ,ףוסבל .טלק תלופכ לכ לש שמתשמה םש הדש תא רמוש תרחא הפמ ,אבה ליעפמה

    ליש לסרמב תואטירסת

    .שומישל רתוי בכרומ ךא רתוי קזח subprocess.Popen() os.system() ב שמתשהל לוכי התא

    :תמויס ידי לע םיצבקה ילדג םוכס בושיחל ןותייפה דוק הנה ,תמדוק המגודב רקבל ידכ .ןותייפ לש הפשה תונוכת םע לסראמ יליעפמ בלשמש לודומ קפסל איה לסרמ לש השיגה

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

    .האלול Python םע הדוקפב שמתשהל ןתינש ךכ ןותיפ לש רוטרטיא הבינמ (םודא ... ls) זגפה תדוקפ לכ .תפטעמה תסרגב ומכ ,תורוניצל םירבוחמ ,םש םיאצמנ םימודאה םיליעפמהו הפמה .ls (file = True, recur

    תפטעמ לסרמ םע םינותנ דסמל השיג

    .לשמל , ~/.marcel.py ,הרוצתה ץבוקב םינותנה דסמל השיגה תא רידגהל ךילע ,תישאר .marcel תורוניצ םע םינותנ דסמל השיג בלשל ךתורשפאב

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

    .לשמל ,SQL -ה ליעפמ תועצמאב םינותנה דסמ תא לואשל ןתינ תעכ ,וז הרוצת עוציב םע (.ליפורפ רדגומ אל םא וב שמתשהל שיש ימכ jao םינותנה דסמ ליפורפ תא ןייצמ DB_DEFAULT) .jao ארקנ םינותנה דסמ ליפורפ

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

    .CSV טמרופב , ~/reorder.csv ץבוקל התליאשה תאצות תא הכילשמו קלח םשב הלבט תנחוב וז הדוקפ

    תפטעמ לסרמ םע קוחרמ השיג

    :תמוצ 4 םע לוכשא תרוצת רידגמ הז ,המגודל . ~/.marcel.py -ב קוחרמ השיג רידגהל ןתינ ,םינותנ דסמל השיגל המודב

    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 -ה תובותכ תא ןייצמ חראמה רטמרפהו ,הסינכה יטרפ תא םינייצמ תוהזהו שמתשמה ירטמרפ .marcel תודוקפב הדבעמכ לוכשאה תא תוהזל ןתינ

    :לוכשאה יבחרב הדוקפ תורושו ךילהת pids לש המישר לבקל ידכ ,המגודל .תחא תבב םיתמצה לכ תא ליעפהל ןתינ ,לוכשאה תרדגה רחאל

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

    .(הדוקפ תרוש ,IP, PID תבותכ לופכ) לש םרז ריזחמ הז

    :ורקב ףסונ עדימל

      .רוזעל וצרת םא רשק ורצ .ליעפ חותיפב אצמנו שדח יד לסרמ