1年ぶりのXonsh
本記事は Xonsh Advent Calendar 2018の16日目の記事です。
昨年の Advent Calendar 以降使っていなかった Xonsh について約1年ぶりに触ります。
ほんと少しでも書いてくれるだけでハッピー。
ということで、よりハッピーになっていただきたいのでほんの少し書きました。
Pythonのモジュールが提供する機能をパイプラインに組み込めれば便利そうだったので、コマンドを作ってみました。
導入
インストール
$ pip install xonsh
起動
$ xonsh
コマンドを作る
~/.xonshrc
に関数とそのエイリアスを定義することで、 xonsh
が認識します。
def _hoge(): print("fuga") aliases["hoge"] = _hoge
aliases
が対話型シェル環境からコマンドとして利用できるコマンド群のエイリアスとなります。
関数の引数には、 args
や stdin
といったコマンドに対する引数や標準入出力などを定義できるようです。
こんなコマンドだと便利?
中央値や最頻値をさくっと出せると便利かもしれないと思い、コマンドを定義してみました。
# ~/.xonshrc import statistics def _mean(args, stdin=None, stdout=None): print( statistics.mean((float(line.strip()) for line in stdin)), file=stdout ) def _mode(args, stdin=None, stdout=None): print( statistics.mode((line.strip() for line in stdin)), file=stdout ) aliases["mean"] = _mean aliases["mode"] = _mode
上記の関数を試してみます。
$ source ~/.xonshrc $ seq 10 | sort -r | mean 5.5 $ echo "1\n2\n3\n2" | sort -r | mode 2 $ echo "ほげ\nふが\nほげ" | sort -r | mode ほげ
複数列に拡張していくのは、引数の管理が大変そうです。 エラー処理も割と大変そうなので、デコレータ作るとボイラープレート減らせるのかな?と思いました。
シンプルに cut
コマンドと組み合わせることで、わざわざファイルを確認するためにコードを書かなくても済みそうです。