Поиск по сайту:

Marcel — более современная оболочка для Linux


Марсель — это новая оболочка. Он во многом похож на традиционные оболочки, но некоторые вещи он делает по-другому:

  • Конвейер: все оболочки используют каналы для отправки текста из вывода одной команды на ввод другой. Марсель передает структурированные данные вместо строк.
  • Python: Marcel реализован на Python и предоставляет Python несколькими способами. Если вам нужно немного логики в ваших командах, marcel позволяет выразить ее на Python.
  • Сценарии. Марсель использует необычный подход к написанию сценариев. Вы, конечно, можете просто записать последовательность команд marcel в текстовый файл и выполнить их. Но Марсель также предоставляет API в виде модуля Python. Вы можете импортировать этот модуль для создания сценариев Python гораздо более удобным способом, чем это возможно при использовании простого Python.

Марсель распространяется по лицензии GPLv3.

Установка Marcel Modern Shell в Linux

Марселю требуется 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 в файле ~/.marcel.py, который читается при запуске (и перечитывается при изменении). Как видно из названия файла, настройка marcel выполняется на Python.

Одна вещь, которую вы, вероятно, захотите сделать, это настроить подсказку. Для этого вы присваиваете список переменной PROMPT. Например, если вы хотите, чтобы в качестве приглашения отображался текущий каталог, напечатанный зеленым цветом, а затем >, напечатанный синим цветом:

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

В результате приглашение выглядит следующим образом:

Это заменяет загадочную конфигурацию PS1, которую вам нужно будет выполнить в bash. Color(0, 4, 0) определяет зеленый (аргументами являются значения RGB в диапазоне 0–5). PWD — это переменная среды, представляющая ваш текущий каталог, и добавление к этой переменной префикса lambda: создает функцию, вычисляемую каждый раз, когда отображается приглашение.

~/.marcel.py также может импортировать модули Python. Например, если вы хотите использовать функции модуля math в своих командах 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.

Найти размеры файлов по расширению

Рекурсивно исследуйте текущий каталог, сгруппируйте файлы по их расширению (например, .txt, .py и т. д.) и вычислите общий размер файлов для каждой группы.

Вы можете сделать это в Марселе следующим образом:

Оператор ls создает поток объектов File (-fr означает рекурсивное посещение каталогов и возврат только файлов).

Объекты File передаются следующей команде Map. map определяет функцию Python в крайних круглых скобках, которая сопоставляет каждый файл с кортежем, содержащим расширение файла и его размер. (Марсель позволяет опускать ключевое слово лямбда.)

Оператор red (сокращение) группирует по первой части кортежа (расширение), а затем суммирует размеры внутри каждой группы. Результат сортируется по расширению.

Исполняемые файлы хоста и конвейер 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 объединяет входящие имена пользователей в одну строку, которая выводится на стандартный вывод.

Написание скриптов в Marcel Shell

Хотя Python иногда считают языком сценариев, на самом деле он не очень хорошо подходит для этой цели. Проблема в том, что запуск команд оболочки и других исполняемых файлов из Python является громоздким. Вы можете использовать os.system(), который прост, но часто не подходит для работы со стандартными вводами, стандартными выводами и стандартными выводами. subprocess.Popen() более мощный, но более сложный в использовании.

Подход Марселя заключается в предоставлении модуля, который интегрирует операторы Марселя с функциями языка 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, так что эту команду можно использовать с циклом for 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

Эта команда запрашивает таблицу с именем part и сохраняет результат запроса в файл ~/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. Параметры пользователя и идентификатора указывают информацию для входа, а параметр host указывает IP-адреса узлов в кластере.

После настройки кластера все узлы могут работать одновременно. Например, чтобы получить список pid процессов и командных строк в кластере:

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

Это возвращает поток кортежей (IP-адрес, PID, командная строка).

Для получения дополнительной информации посетите:

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

Marcel – довольно новая платформа, которая находится в стадии активной разработки. Свяжитесь с нами, если хотите помочь.