【Xonsh】Python製シェルが尖りまくってて神


Macのターミナル環境を色々改造しつつその一環としてshellも何個か見てきました。
bash, zsh, fish ...

中でもここ半年くらいはPython製のXonshが超絶お気に入りなので自分なりに紹介します。

ちなみに元ネタと言うか見つけたきっかけは、機械学習界隈で有名なばんくしさんのブログです。

[Python製シェルxonshを半年使った所感や環境設定のまとめ](https://vaaaaaanquish.hatenablog.com/entry/2018/06/22/194227)

この人すごすぎ
## What's Xonsh

タイトルのまんまですが、**Pythonで作られたShell**です。
**Pythonで作られ、Pythonで動き、Pythonが実行できます。**

他のシェルが何で動いてるかとかはわかりませんが、とにかくこいつが超尖っててイケてます。

## Commnd and Python
Pythonで作られている事のメリットその１として、コマンドと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好きはお試しを！！