Bash
shell
シェル
Python3
xonsh

xonshが超カッコイイ話


はじめに

私事ですが無事就職しました(おめでとうございます(ありがとうございます))

さて、今回はxonshというシェルが最高にイケててカッコイイので、会社のいろんな人に布教出来たらいいなと思って記事を書くことにしました、勿論他の人にも。(xonshの記事はググッてもまだ少ないから今なら目立てるとかいう気持ちはありません)


xonshって?

PythonistaのPythonistaのためのPythonistaによるシェルです(Pythonista以外にも便利ですが)

つまり、Pythonで作られたPythonが直接動作するシェルです。

え?????Pythonが直接動くの??????めっちゃカッコよくない?????????

そうです、めっちゃカッコイイです。しかも、後で紹介しますがシェルスクリプトと直接連携もできちゃいます。

当然bashコマンドも実行可能。


導入

6/7 追記:前提環境としてPython3.x系を導入しておいてください

pip install xonsh

readlineshellとして使うならば追加で

pip install gnureadline

macの場合bash補完パッケージとして

brew install bash-completion2


起動

シェルで xonsh とコマンド名を打てば、Pythonで書かれた xonsh が起動する。

$ xonsh


Welcome to the xonsh shell (0.9.5)

~ Python-powered, cross-platform, Unix-gazing shell ~

--------------------------------------------------------------------------------
xonfig tutorial -> Launch the tutorial in the browser
xonfig wizard -> Run the configuration wizard and claim your shell
(Note: Run the Wizard or create a ~/.xonshrc file to suppress the welcome screen)


xonshによるシェルスクリプトとPythonの連携

xonsh上ではシェルスクリプトやコマンドとPythonの連携が死ぬほど簡単です。

例えば

$PATH

の実行結果はリスト型のオブジェクト

EnvPath([

'usr/bin',
'usr/local/bin'
])

のように返されます。

Pythonのリスト型オブジェクトなので当然次のような操作が出来ます。

$PATH.append('任意のパス')

これ、めっっっっっちゃエモく無いですか?

こうすることで起動中のシェルに一時的にパスが追加されます、.xonshrcに記述すればずっと追加され続けます。

他にも

print($(ls -la))

これでコマンドの実行結果を出力できるし、当然変数に格納できるので

cmd = $(ls -la)

print(cmd)

とかも出来る、type()でクラスも調べられる。

ちなみにxonshを起動しなくても

xonsh -c "print($(pwd))"

とかも出来る。

他にも、Pythonファイルからのimportとか、Pythonがインタプリンタで出来ることはなんでも出来ます。


xonshrc

お察しの通りxonshrcはPythonで書ける。

例えば

def _hoge:

return ('hogehoge', None)

aliases['hoge'] = _hoge

後はxonshで

hoge

と打ち込めばちゃんと出力される。

xonshrcの設定例に関しては先達がたくさんイケてるものを上げているのでそちらに譲ります(めんどくさかったわけではない)(そのうち記事を書くかも)


[2019/6/10: 追記]強力な補完

めっちゃ大事なポイントなのに書き忘れていたんですが、Xonshのメリットはもう一つ、強力な補完機能です。

といってもXonshのプロジェクトから分離してすべてのシェルで使えるのですが、xonshでは未だに標準でサポートしています。

brew install bash_completion2

これだけで強力な補完がいつでも利用できるようになります、bashなどで使いたい場合はinstallメッセージの指示に従う必要があるようです。


デメリット

こんだけとがってると、まあ当然いい事ばかりではないです、というわけでデメリットは以下


  • 起動が遅い

  • Pythonがわからないと恩恵が薄い

といったところです、起動に関してはmacでは不満を感じた事がないですが、wslで起動した時が顕著に遅いです(wsl自体が遅いのもありますがxonshは特に)

起動だけじゃなくスクリプトの実行もPython使ってる関係上どうしても他のシェルよりは遅くなります

2つ目に関しては…諦めるしかないですね、Pythonをしてください()


参考記事


ほとんどここの記事しか見てない

https://qiita.com/advent-calendar/2017/xonsh