【Xonsh Advent Calendar 2017の13日目の記事です。】
217 | 218 |Xonshがいいという話を聞いて、これは使ってみないと!と思い使ってみました。
219 | 220 |その備忘録です。
227 | 228 |-
229 |
- Xonshとは 230 |
- 導入 231 |
- 使ってみた
-
232 |
- 環境変数 233 |
- Python-modeとSubprocess-mode 234 |
- Subprocessとして 235 |
237 | - プロセス置換ができない? 238 |
- 使ってみて感想 239 |
Xonshとは
242 | 243 |251 | 252 |the xonsh shell
244 | 245 |~ こちらトム少佐からXonsh地上管制へ ~
246 | 247 |XonshはPythonにより動作する、クロスプラットフォームでUnixのようなシェル言語であるコマンドプロンプトです。 248 | この言語はPython 3.4+の上位互換で、慣れ親しんだBashやIPythonなどの基本的なシェル命令を追加したものです。 249 | LinuxやMac OSX、Windowsといったメジャーなシステム上で動作します。 250 | Xonshは、普段使いで上級者も初級者も同じように使えるように作られています。
勢いでxonshトップページの冒頭を訳してみましたが、This is major Tom to ground xonshtrol
は、デビッド・ボウイのスペイス・オディティのThis is major Tom to ground control
をもじっているようで、英語力のない自分には理解しがたいです(汗)
とにかく冒頭からは、Pythonで作られた良い感じのシェルだということが分かったので使ってみます。
255 | 256 |導入
257 | 258 |Python 3.4以上の環境を用意して、pip install xonsh
でインストールできます。
ログインシェルにする場合は、システムにPython 3.4以上をインストールしておくと安心かと思います。
261 | 262 |使ってみた
263 | 264 |Tutorial見ながら使ってみて、普段使っているzshとは異なる機能や文法に触れました。 265 | (ノリで記事を書いてみたら、ばんくしさんの1日目の記事と結構かぶってしまいました( ))
266 | 267 |環境変数
268 | 269 |$
+変数名が環境変数となります。また代入は、Pythonと同じように記述します。
username@hostname ~ $ $HOST 272 | 'hostname' 273 | username@hostname ~ $ $HOST = "hogefuga" 274 | username@hostname ~ $ $HOST 275 | 'hogefuga' 276 |277 | 278 | 279 |
xonshスクリプトから参照したいときは、${}
構文を使うことで文字列で参照できます。
username@hostname ~ $ ${"HOME"} 282 | "/home/username" 283 |284 | 285 | 286 |
Python-modeとSubprocess-mode
287 | 288 |xonshを使っていると、まるでIPythonのような使い勝手でbash likeなPythonというように思えてきます。 289 | 両方の文法が使えるのですが、混在すると曖昧となるため、コマンドと同名の変数名やメソッド名は避けましょうというお話です。
290 | 291 |username@hostname ~ $ ls = 44 292 | username@hostname ~ $ ls 293 | 44 294 | username@hostname ~ $ del ls 295 | username@hostname ~ $ ls 296 | ... 297 |298 | 299 | 300 |
Subprocessとして
301 | 302 |$()
でコマンドを実行すると、PythonでSubprocessを使ったときのように、コマンドの戻り値が文字列型で返ってきます。
username@hostname ~ $ $(ls) 305 | hoge\nfuga\ndotfiles 306 |307 | 308 | 309 |
$[]
という書き方でもSubprocessとして動作させられますが、直に標準出力に出力されるようで、戻り値としてはNone
です。
310 | パイプなどで渡すとエラーとなりました。
username@hostname ~ $ $[ls]|less 313 | hoge 314 | fuga 315 | ... 316 | xonsh: For full traceback set: $XONSH_SHOW_TRACEBACK = True 317 | AttributeError: 'NoneType' object has no attribute 'splitlines' 318 | username@hostname ~ $ $[ls] == None 319 | hoge 320 | fuga 321 | ... 322 | True 323 |324 | 325 | 326 |
プロセス置換ができない?
327 | 328 |bashやzshで一時ファイルを作成するかわりに、プロセス置換で作業することが多いです。 329 | プロセス置換はbashやzshに搭載されている便利な機能の一つで、引数でファイルを指定するかわりにコマンドの実行結果をファイルとして扱える機能です。 330 | つまり中間ファイルが不要ということです。(どの中間ファイルを使ったか忘れがちですが、これだとコマンドの履歴として記録されます。)
331 | 332 |入力をプロセス置換するのは、だいたい2つ以上のファイルを利用するコマンドを使うときです。(ひとつのファイルなら基本的にはパイプで) 333 | diffを取る時やjoin、pasteなどで、以下のように使います。
334 | 335 |username@hostname ~ $ diff <(sort -nrk1 hoge.txt) <(sort -nrk1 fuga.txt) 336 |337 | 338 | 339 |
Issueをprocess substitution
で検索してみると、現時点(2017/12/10)で一番新しいものはIssue 1307で、プロセス置換は使えないようです。
340 | $(echo Hi Mom > /tmp/mom)
が/tmp/mom
を返すので、プロセス置換と似たことができると読めたのですが、v0.6.0では空文字列が返ってきました。
詳しい人、教えてください。
343 | 344 |使ってみて感想
345 | 346 |シェルの設定ファイルを書かない人や、プロセス置換などを利用しない人にとっては、十分すぎる補完機能やシンタックスハイライトと感じました。
347 | 348 |zshから乗り換えるとなると、勝手が違うため覚えることが多いように思います。
349 | 350 |Python言語が使えるという利点を活かす利用法を考えたいです。 351 | たぶん、awkやperl、sedを使うかわりにうまく使えるのだと思います。
352 | 353 | 354 |