BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

Marcel –Linux用のより近代的なシェル

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

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

マルセル GPLv3でライセンスされています 。

LinuxへのMarcelModernShellのインストール

MarcelにはPython3.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 –Linux用のより近代的なシェル

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

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

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

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

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

Marcel –Linux用のより近代的なシェル

これは、不可解なPS1に代わるものです。 bashで行う必要のある構成。 色(0、4、0) を指定します 、(引数は RGB 0〜5の範囲の値 )。 PWDは、現在のディレクトリを表し、この変数の前にlambda:を付ける環境変数です。 関数を生成し、プロンプトが表示されるたびに評価されます。

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

from math import *

これを実行すると、そのモジュールからシンボルを参照できます。 pi

Marcel –Linux用のより近代的なシェル Marcel –Linux用のより近代的なシェル

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

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

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

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

Marcel –Linux用のより近代的なシェル Marcel –Linux用のより近代的なシェル

マルセルシェルの例

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

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

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

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

Marcel –Linux用のより近代的なシェル

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

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

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

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

パイプライン marcel演算子とホスト実行可能ファイルが混在している場合があります。演算子はオブジェクトをパイプしますが、演算子/実行可能境界では、代わりにマーセルが文字列をパイプします。

たとえば、このコマンドは演算子と実行可能ファイルを組み合わせて、シェルが/bin/bashであるユーザーのユーザー名を一覧表示します。 。

$ cat /etc/passwd \
| map (line: line.split(':')) \
| select (*line: line[-1] == '/bin/bash') \
| map (*line: line[0]) \
| xargs echo
Marcel –Linux用のより近代的なシェル Marcel –Linux用のより近代的なシェル

catはLinuxの実行可能ファイルです。 / etc / passwdと表示されます 、およびmarcelは、その内容をmarcelオペレーターマップの下流にパイプします。

mapの括弧で囲まれた引数は、:で行を分割するPython関数です。 セパレーター、7タプルを生成します。 選択 は、最後のフィールドが / bin / bashであるタプルを識別するPython関数を引数とするmarcel演算子です。 。

次の演算子である別のマップは、各入力タプルのユーザー名フィールドを保持します。最後に、 xargs echo 着信ユーザー名を1行にまとめ、stdoutに出力します。

MarcelShellでのスクリプト

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 -fr ls(file =Trueになります 、 recursive =True) 。マップと赤い演算子もそこにあり、シェルバージョンのようにパイプで接続されています。シェルコマンド全体(ls…red) コマンドをPythonのforループで使用できるようにPythonイテレータを生成します。

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

データベースアクセスを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形式。

MarcelShellを使用したリモートアクセス

データベースアクセスと同様に、リモートアクセスは~/.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コマンドで。ユーザーとIDのパラメーターは、ログイン情報とホストを指定します パラメータは、クラスタ上のノードのIPアドレスを指定します。

クラスターを構成すると、すべてのノードを一度に操作できます。たとえば、プロセスの pidのリストを取得するには およびクラスター全体のコマンドライン:

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

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

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

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

マルセル かなり新しく、活発に開発されています。手伝いたい場合は連絡してください。


  1. Linuxシェルプログラミングの数学的側面–パートIV

    この投稿では、S criptsについて説明します。 数学から および番号 視点。もっと複雑なスクリプトを投稿しましたが(シンプルな電卓 )前回の投稿でしたが、ユーザーの側では理解するのが難しかったので、小さなパケットで学習することのもう1つの便利な側面を人々に学んでもらうことを考えました。 この記事の前に、シェルスクリプトシリーズの3つの記事 公開されており、次のとおりです。 Linuxシェルと基本的なシェルスクリプトを理解する–パートI シェルプログラミングを学ぶための5つのシェルスクリプト–パートII Linux BASHスクリプティングの世界を航海する–パートIII

  2. Linux初心者および管理者向けの4つの無料シェルスクリプト電子書籍

    システム管理 マルチユーザーコンピュータシステムとサーバーの信頼性の高い操作を扱う情報技術のブランチです。マルチユーザーコンピュータシステムとサーバーの信頼できる操作を担当する人は、システム管理者と呼ばれます。 。 Linuxを専門とするシステム管理者はLinuxシステム管理者と呼ばれます。一般的なLinuxシステム管理者の役割は、ハードウェアメンテナンス、システムメンテナンス、ユーザー管理、ネットワーク管理、システムパフォーマンス、リソース使用率の監視、バックアップ、セキュリティの確保、システムの更新、実装など、さまざまな側面で異なります。ポリシー、ドキュメント、アプリケーションのインス