ウェブサイト検索

Marcel - Linux 用のより最新のシェル


マルセルは新しいシェルです。これは多くの点で従来のシェルに似ていますが、いくつかの点で異なります。

  • パイプ: すべてのシェルはパイプを使用して、あるコマンドの出力から別のコマンドの入力にテキストを送信します。 Marcel は、文字列の代わりに構造化データをパイプします。
  • Python: Marcel は Python で実装されており、さまざまな方法で Python を公開します。コマンドに少しのロジックが必要な場合、marcel を使用するとそれを Python で表現できます。
  • スクリプト: マルセルは、スクリプトに対して珍しいアプローチを採用しています。もちろん、一連の marcel コマンドをテキスト ファイルに記述して実行することもできます。ただし、Marcel は Python モジュールの形式で API も提供します。このモジュールをインポートすると、プレーンな Python よりもはるかに便利な方法で Python スクリプトを実行できます。

マルセルGPLv3に基づいてライセンスされています。

Linux への Marcel Modern Shell のインストール

Marcel にはPython 3.6 以降が必要です。 Linux で開発およびテストされており、 主にmacOSで動作します。 (Windows への移植、またはmacOS の欠陥の修正を支援したい場合は、ご連絡ください。)

自分で使用するためにマルセルをインストールするには:

python3 -m pip install marcel

または、すべてのユーザーに対してインストールする場合 (例: /usr/local に):

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

marcel をインストールしたら、コマンド marcel を実行して動作していることを確認し、marcel プロンプトで version を実行します。コマンド:

marcel

マルセルシェルのカスタマイズ

ファイル ~/.marcel.py 内の marcel をカスタマイズできます。このファイルは起動時に読み取られます (変更時に再読み込みされます)。ファイル名からわかるように、marcel のカスタマイズは Python で行われます。

おそらく実行したいことの 1 つは、プロンプトをカスタマイズすることです。これを行うには、PROMPT 変数にリストを割り当てます。たとえば、プロンプトに現在のディレクトリを緑色で表示し、その後に > を青色で表示したい場合は、次のようにします。

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

結果のプロンプトは次のようになります。

これは、bash で行う必要がある不可解な PS1 設定を置き換えます。 Color(0, 4, 0)を指定します (引数は0-5の範囲のRGB値です)strong>)。 PWD は現在のディレクトリを表す環境変数であり、この変数の先頭に lambda: を付けると、プロンプトが表示されるたびに評価される関数が生成されます。

~/.marcel.pyPython モジュールをインポートすることもできます。たとえば、marcel コマンドで math モジュールの関数を使用したい場合:

from math import *

これを完了すると、そのモジュールからシンボルを参照できるようになります。 pi:

pi が括弧で囲まれていることに注意してください。一般に、marcelPython 式を区切るために括弧を使用します。したがって、(pi) は、変数 pi の値を取得する Python 式を評価します。この方法で従来の環境変数にアクセスすることもできます。 (USER)(HOME)、または marcel の名前空間のシンボルに依存する有効な Python 式。

もちろん、独自のシンボルを定義することもできます。たとえば、この関数定義を ~/.marcel.py に配置すると、次のようになります。

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

次に、コマンドラインで階乗関数を使用できます。

マルセルシェルの例

ここでは、marcel シェルのコマンドの例をいくつか学習します。

拡張子でファイルサイズを検索

現在のディレクトリを再帰的に探索し、ファイルを拡張子 (例: .txt.py など) ごとにグループ化し、各グループの合計ファイル サイズを計算します。

これはマルセルで次のように行うことができます。

ls 演算子は、File オブジェクトのストリームを生成します (-fr は、ディレクトリに再帰的にアクセスし、ファイルのみを返すことを意味します)。

ファイル オブジェクトは次のコマンド、map にパイプ処理されます。 マップでは、最も外側の括弧内に Python 関数を指定します。この関数は、各ファイルを、ファイルの拡張子とそのサイズを含むタプルにマップします。 (Marcel では、lambda キーワードを省略することができます。)

赤色 (reduce) 演算子は、タプルの最初の部分 (拡張) ごとにグループ化し、各グループ内のサイズを合計します。結果は拡張子順に並べ替えられます。

ホスト実行可能ファイルと Marcel パイプライン

パイプラインには、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 オペレーター マップにパイプします。

マップの括弧で囲まれた引数は、: 区切り文字で行を分割し、7 つのタプルを生成する Python 関数です。 select は、最後のフィールドが /bin/bash であるタプルを識別する Python 関数を引数とする marcel 演算子です。

次の演算子である別のマップは、各入力タプルのユーザー名フィールドを保持します。最後に、xargs echo は受信したユーザー名を 1 行に結合し、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 -frls(file=True, recursive=True) に変わります。シェル バージョンと同様に、マップと赤色のオペレーターもパイプで接続されています。シェル コマンド (ls … red) 全体で Python イテレータが生成されるため、コマンドを Python の for ループで使用できます。

Marcel Shell を使用したデータベース アクセス

データベース アクセスを marcel パイプラインと統合できます。まず、構成ファイル ~/.marcel.py でデータベース アクセスを構成する必要があります。

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

DB_DEFAULT = 'jao'

これにより、psycopg2 ドライバーを使用して、acme という名前の Postgres データベースへのアクセスが構成されます。 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 コマンドでラボとして識別できます。ユーザー パラメータとアイデンティティ パラメータはログイン情報を指定し、ホストパラメータはクラスタ上のノードの IP アドレスを指定します。

クラスターを構成すると、すべてのノードを同時に操作できるようになります。たとえば、クラスター全体のプロセスpidとコマンド ラインのリストを取得するには、次のようにします。

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

これにより、(IP アドレス、PID、コマンド ライン) タプルのストリームが返されます。

詳細については、次のサイトをご覧ください。

  • https://www.マルセルザシェル.org/
  • https://github.com/geophile/marcel

マルセルは非常に新しく、活発に開発中です。お手伝いしたい場合はご連絡ください。