Macのターミナル環境を色々改造しつつその一環としてshellも何個か見てきました。
bash, zsh, fish ...
中でもここ半年くらいはPython製のXonshが超絶お気に入りなので自分なりに紹介します。
ちなみに元ネタと言うか見つけたきっかけは、機械学習界隈で有名なばんくしさんのブログです。
Python製シェルxonshを半年使った所感や環境設定のまとめ
この人すごすぎ
What's Xonsh
タイトルのまんまですが、Pythonで作られたShellです。
Pythonで作られ、Pythonで動き、Pythonが実行できます。
他のシェルが何で動いてるかとかはわかりませんが、とにかくこいつが超尖っててイケてます。
Commnd and Python
Pythonで作られている事のメリットその1として、コマンドとPythonスクリプトの同居ができます。
[ ~/Desktop/tmp ]
$ ls -al
Permissions Size User Date Modified Name
drwxr-xr-x - *** 18 12 19:20 .
drwx------ - *** 18 12 19:18 ..
[ ~/Desktop/tmp ]
$ dirs = ['a', 'b', 'c']
[ ~/Desktop/tmp ]
$ for dir in dirs:
. mkdir @(dir)
.
[ ~/Desktop/tmp ]
$ ls -al
Permissions Size User Date Modified Name
drwxr-xr-x - *** 18 12 19:21 .
drwx------ - *** 18 12 19:18 ..
drwxr-xr-x - *** 18 12 19:21 a
drwxr-xr-x - *** 18 12 19:21 b
drwxr-xr-x - *** 18 12 19:21 c
こんな感じ。
わざわざ変数に入れてfor文回すよりmkdir × 3の方がはえーよ!!と思うかもしれませんが、
処理がえぐいくらい増えた時とかこれ使ったらめちゃくちゃイケてると思いませんか?
当然のごとく関数だって定義できちゃいます。
[ ~/Desktop/tmp ]
$ def hello_xonsh():
. print('hello xonsh !!!')
.
[ ~/Desktop/tmp ]
$ hello_xonsh()
hello xonsh !!!
.xonshrc
他のシェル同様、xonshにもrcファイルがあります。(.xonshrc)
もう想像ついてるかもしれませんが、このrcファイルが全てPythonで記述できます。
個人的にはこれが神すぎて使ってる
- Aliases
aliases['ls'] = 'exa -ahl --git'
aliases['la'] = 'exa -ahl --git'
aliases['ll'] = 'exa -ahl --git'
aliases['l'] = 'exa -ahl --git'
aliases['cat'] = 'bat'
aliases['tf'] = 'terraform'
aliases['do'] = 'docker'
aliases['dc'] = 'docker-compose'
aliasesという辞書型変数が内部で定義されていてそこに追加する。
かっこよすぎる。
- env
import os
$DEV_ROOT = os.environ.get('HOME') + '/dev'
環境変数は$ + 変数名で定義する。
importすればPythonの標準ライブラリも使い放題。
- Command
def _set_aws_profile(args):
$AWS_PROFILE = args[0]
$AWS_DEFAULT_PROFILE = args[0]
print('aws profile is : ', p)
aliases['awsp'] = _set_aws_profile
複雑なコマンドは関数で定義してそのままaliasesに突っ込める。
args引数でコマンド引数を受け取れる。
ちなみに、ここでは引数をargsしか定義してないけど、他にもstdinとかstdoutとかも取れるみたい。
(ここはうまく使いこなせてない)
Install
ここまで読んでもし使いたくなってくれたらinstallは一瞬です。
$ brew install xonsh
もしくは
$ pip install xonsh
などなど、他にも大体の環境でインストールできる。
起動はそのまんま
$ xonsh
Use Xonsh!
Xonshは尖りまくってるゆえにデメリットもあります。
例えばコマンドによっては引数をシングルクオートでうまく括らないと動かない時とかありました。
でもそんなちっぽけなデメリットを遥かに上回るイケイケ具合なので使ってます。
Python好きはお試しを!!