使いやすいように Linux (WSL) をカスタマイズ

[Windows で WSL 環境を整えた](https://qiita.com/kikuchi_kentaro/items/9dc441f64c17a38aad96) 際、ついでに WSL に導入していた各コマンド・ツールも一通り見直したのでまとめておく。

**見やすく・速く・操作しやすくて分かりやすい** 環境構築を目指している。

# 標準コマンドの置き換え系

新しいツールを導入しても、導入したことを忘れてしまい結局使ってないなんてことが多いので、標準コマンドを置き換えることで強制的に使わざるを得ない状況にする。

_Note : Shell Script 内で利用されるコマンドが置き換えられてしまうと意図しない動作をする危険性がある為、Shell がインタラクティブな場合にのみ適応されるように定義する必要がある。_

```python:config.fish
if status --is-interactive
    alias ls='exa -l --time-style="long-iso"'
    ...
end
```

_また、インタラクティブな時でも Alias を使わずに元のコマンドを実行する場合、 `command` が利用できる。_

```bash
$ command ls
# Coreutils の ls が実行される
```

## **exa**

ls を色付きで見やすくしたコマンド。Rust 製。

https://github.com/ogham/exa
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/312f8b56-9176-1f60-e81a-3eb9c689fd64.png)

- 色綺麗
- git と連携、`A|C|D|M|R|T|U|X|B` を表示 
- `.gitignore` で指定されているファイルは無視 ( オプションで切り替え可 )

### :sunny: _ls → exa_

exa は ls の置き換えとして作られているので、よく使うオプションは互換性高め。

### :partly_sunny: _tree → exa -T_

exa はツリー構造での出力にも対応している。
しかし、ファイルが多いと出力し始めるまでに時間がかかる。その点 tree コマンドはレスポンスが良い。
exa は表現力は高いのだが、tree のままでも良いかも。

## **bat**

cat を便利にしたコマンド。Rust 製。

https://github.com/sharkdp/bat
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/d8d69fd0-9cae-1567-293c-707e96f376a1.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/e7853adf-000f-68c3-1bb7-9195d1735178.png)

- 色綺麗
- less っぽくページング
- git と連携、diff 情報を表示
- コンテンツをパイプラインから入力可能
    - `curl -s https://raw.githubusercontent.com/sharkdp/bat/master/src/main.rs | bat -l rs`
- Sublime Text の `.sublime-syntax` を追加してビルドすれば、対応 Syntax を自分で増やせる

[参考 : Alternatives](https://github.com/sharkdp/bat/blob/master/doc/alternatives.md)

### :sunny: _cat → bat --paging=never_

まず問題なく使える。
Paging を使わなければ、パフォーマンスも気にならないレベル。

### :cloud: _less → bat --paging=always_

パイプラインからの入力もでき、コンテンツ内操作方法も less とほぼ一緒。
置き換え可能かどうか、様子見中。

## **ydiff**

見やすい diff。Python 製。

https://github.com/ymattw/ydiff
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/25f03904-1f40-ebec-3ed8-203470c3448e.png)

- 見た目綺麗
- Side-by-Side で表示が可能
- 比較機能を持っているわけではなく、他の比較ツールから受け取った比較結果を整形・ハイライトしている
    - `diff -u`
    - `git diff`, `hg diff`, `svn log --diff`
    - Diff File, Patch File
        - i.e. Github PullRequest - `curl https://github.com/ymattw/ydiff/pull/63.diff | ydiff -s`

### :sunny: _diff → diff -u A B | ydiff -s_

標準の diff に比べると、格段に見やすい。

## **ripgrep**

速い grep。Rust 製。

https://github.com/BurntSushi/ripgrep
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/d61bf7e4-8250-04b1-cff9-c5579237835b.png)

- 色綺麗
- 速い
- `.gitignore` で指定されているファイルは無視 ( オプションで切り替え可 )

[参考 : ripgrep is faster than {grep, ag, git grep, ucg, pt, sift}](https://blog.burntsushi.net/ripgrep/)

### :sunny: _grep → ripgrep_

grep との違いをあまり意識せず使えてる。かつ、ripgrep の便利機能も使えて大変良い。

## **fd**

速い find。Rust 製。

https://github.com/sharkdp/fd

![fd.gif](https://qiita-image-store.s3.amazonaws.com/0/20198/a73d6390-1581-5f0a-b53a-064f15a0b43d.gif)

- 色綺麗
- 速い
- `.gitignore` で指定されているファイルは無視 ( オプションで切り替え可 )

[参考 : Benchmark](https://github.com/sharkdp/fd#benchmark)

### :partly_sunny: _find → fd_

オプションが全然違う。
fd のインターフェイスの方が個人的には好みだが、こっちに慣れすぎるのも… と葛藤している。 

## **tin-summer**

見やすい du。Rust 製。

https://github.com/vmchale/tin-summer
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/b08634f1-9c1c-a216-a550-5c45f32f6b87.png)

- ちょっと色綺麗
- ディスク使用量ではなく、ファイルサイズを返す
- 並列化で du より速いケースも
- サブコマンドでの操作はちょっと癖がある

[Alternative : dust](https://github.com/bootandy/dust)

### :cloud_rain: _du → tin-summer_

操作感が独特。
ファイルサイズを表示するだけのコマンドと言っては失礼かもしれないが、それにサブコマンドはやり過ぎでは …

## **rip**

ゴミ箱的な削除ができる rm。Rust 製。

https://github.com/nivekuil/rip

- `/tmp/graveyard-USERNAME` がゴミ箱
    - なので、Windows のように永続化目的じゃない点は注意
- フォルダ階層毎に削除履歴が管理され、それぞれリストアップ・復元ができる

[Alternative - gomi ( peco っぽい UI )](https://github.com/b4b4r07/gomi)

### :partly_sunny: _rm → rip_

公式には [置き換えはオススメしていない](https://github.com/nivekuil/rip#-notes) が、自分だけで使うなら。
他のサーバ触ってる時、ゴミ箱あると勘違いして勢いよく消して後悔するくらいかな、きっと。

**■ Windows との切り分け**

WSL を使っているので、`/mnt/c` 以下は Windows のゴミ箱に捨てたいけど、それ以外は rip に捨てたいという思いもあるが、オプションの解析等必要で骨が折れそうなので、諦めた。


## **pigz, lbzip2, pixz**

並列化されて速くなった gzip, bzip2, xz。
多分、全部 C 言語製。

https://github.com/madler/pigz
https://github.com/kjn/lbzip2
https://github.com/vasi/pixz

- 速い
- CPU 負荷ちょっと高い

### :sunny: _gzip, bzip2, xz → pigz, lbzip2, pixz_

だいたい同じ。
tar での解凍に使うのであれば `tar --use-compress-prog=XXXX` の指定が必要。

**■ comp, decomp**

置き換えとは別に、Linux の圧縮/解凍 が未だに手に馴染まないので fish shell でちょっとしたプラグインを書いている。
速くて高圧縮と評判の zstd や、Windows とやり取りも多いので zip, 7z も使えるようにしている。

https://github.com/kentork/fish-comp
![comp.gif](https://qiita-image-store.s3.amazonaws.com/0/20198/7a8f7396-f1c2-e3c8-28a9-094c7f475163.gif)

[Alternative : atool ( 同様に、圧縮/解凍を一括管理 )](http://www.nongnu.org/atool/)

## **httpie**

ヒューマンフレンドリな http クライアント。Python 製。

https://github.com/jakubroztocil/httpie

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">🍰 Try HTTPie straight from your browser: <a href="https://t.co/0vuzOzDk8S">https://t.co/0vuzOzDk8S</a> <a href="https://t.co/94EuJmWg9W">pic.twitter.com/94EuJmWg9W</a></p>&mdash; httpie (@clihttp) <a href="https://twitter.com/clihttp/status/923240301250207744?ref_src=twsrc%5Etfw">2017年10月25日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- 色綺麗
- 直感的に使えるインターフェイス
- ヘルプ見やすい

[Alternative - http-prompt ( httpie を対話的に操作 )](https://github.com/eliangcs/http-prompt)
[Alternative - httpstat ( curl -v を見やすく )](https://github.com/davecheney/httpstat)
[Alternative - zou ( ダウンロード速い )](https://github.com/k0pernicus/zou)

### :sunny: _wget → httpie --follow -d_

ほぼ同じことができて、かつ情報が読みやすい。

### :cloud_snow:  _curl → httpie_

完全に別物。
正直、http というコマンドは既に手に馴染んでいるので、curl を置き換える必要がなかった。


# 開発支援コマンド

標準コマンド置き換えではないが、便利なので使っているもの。
正確には、**忘れずに使い続けられているもの** とでも言ったほうが良いか。

## **micro**

操作感が GUI エディタに近い CLI テキストエディタ。Go 製。

https://github.com/zyedidia/micro
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/3a36ab8e-a778-7495-c812-1370862c64d9.png)

- 色綺麗
- 操作しやすい

[Alternative : iota](https://github.com/gchp/iota)

## **nnn**

GUI ツールと連携可能な CLI ファイルマネージャ。C 言語製。

https://github.com/jarun/nnn
![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/3984af0e-fe91-3e8e-aa7c-264316ae831e.png)
[go to movie on vimeo](https://vimeo.com/233223942)

- 速い
- 操作は難しくない。すぐ慣れる
- **X Windows System 前提** なのが、WSL 的には少し辛い

[Alternative : Lf](https://github.com/gokcehan/lf)
[Alternative : ranger](https://github.com/ranger/ranger)

**■ WSL 化**
WSL に対し特別の配慮は無いので、様々手を入れる必要がある。

◆ xdg-open → wsl-open
nnn は、ファイルを OS の既定のアプリに処理を渡すために、xdg-open を利用しているが、WSL では当然動かない。
なので、[wsl-open](https://github.com/4U6U57/wsl-open) と入れ替えることで動作させている。

```bash
$ curl -LO https://raw.githubusercontent.com/4U6U57/wsl-open/master/wsl-open.sh
$ sudo chown root:root wsl-open.sh && sudo chrmod +x wsl-open.sh && sudo mv wsl-open.sh /usr/bin/wsl-open
$ sudo mv /usr/bin/xdg-open /usr/bin/xdg-open.old && sudo ln -s /usr/bin/wsl-open /usr/bin/xdg-open
```

wsl-open は、DrvFs ( `/mnt/*` 以下 ) はそのまま Windows の規定のアプリに渡されるが、VolFs ( `/mnt` 以外 ) は **一旦 Windows のテンポラリフォルダにコピーされてから実行される** ので注意が必要。

## **watchexec**

ファイルの変更監視してコマンドをトリガーできるツール。Rust 製。

https://github.com/mattgreen/watchexec

- 言語ランタイムを前提としない
- 速い
- 拡張子指定や無視指定も可能
    - `.gitignore` を忖度

[Alternative : funzzy](https://github.com/cristianoliveira/funzzy)
[Alternative : watchman](https://github.com/facebook/watchman)
[Alternative : entr](https://bitbucket.org/eradman/entr/)
[Alternative : modd](https://github.com/cortesi/modd)
[Alternative : watchdog](https://github.com/gorakhargosh/watchdog)
[Alternative : fswatch](https://github.com/emcrisostomo/fswatch)

## **hyperfine**

ベンチマーク統計を簡単に取れるツール。Rust 製。

https://github.com/sharkdp/hyperfine

![68747470733a2f2f692e696d6775722e636f6d2f354f71724757652e676966.gif](https://qiita-image-store.s3.amazonaws.com/0/20198/c29cb43e-ae76-715a-a374-287e07e865d6.gif)

- 実行回数を指定可能
- ベンチマーク前にウォームアップが可能
- キャッシュクリアのような処理実行前に毎度実行したい処理を指定可能

[Alternative : bench ( hyperfine が参考にしたツール )](https://github.com/Gabriel439/bench)

## **tokei**

ソースファイルの統計情報を出力してくれるツール。Rust 製。

https://github.com/Aaronepower/tokei

![tokei.gif](https://qiita-image-store.s3.amazonaws.com/0/20198/11bd5e62-9185-b5b9-f311-625720676f32.gif)

- 速い

[Alternative : cloc](https://github.com/AlDanial/cloc)
[Alternative : loc](https://github.com/cgag/loc)

## **usql**

SQL クライアント。結構色々な DB に接続できる。Go 製。

https://github.com/xo/usql

![usql.gif](https://qiita-image-store.s3.amazonaws.com/0/20198/820b985b-d8af-6026-d2ff-cd36da66c47f.gif)

- 主要な RDB に対応。一部、NoSQL にも ( SQL Like なクエリを持つものだけ？ )
- 使い勝手は psql

# 便利だけど、使わなかったコマンド

便利さは理解し導入したが **知らぬ間に忘れてしまっていた** 者達。
誰かにとっては有用かもしれない。

## **parallel**

GNU parallel の Rust 書き換え。Rust 製。
https://github.com/mmstick/parallel

<details><summary>一言感想</summary><div>
凄いけど、使い所が難しかった。
</div></details>

## **progress**

cp, mv, rm... などのコマンドの進捗を確認できる。C 言語製。
https://github.com/Xfennec/progress

<details><summary>一言感想</summary><div>
凄いけど、別タブ開くのが面倒だし、自然と使わなくなった。
</div></details>

## **PathPicker**

パイプラインで受け取ったコンテンツからファイルパスを選択し、何かしらの処理を加える。Python 製。
https://github.com/facebook/PathPicker

<details><summary>一言感想</summary><div>
凄いけど、使い所が思いつかなかった。
</div></details>

## **xsv**

CSV ファイルを検索・抽出・分析・分割 & 結合できる。Rust 製。
https://github.com/BurntSushi/xsv

<details><summary>一言感想</summary><div>
凄いけど、操作覚えられる気がしなかった。
</div></details>

## **pup**

HTML 版の jq みたいなもの。CSS Selector Like なクエリでノードを選択する。Go 製。
https://github.com/ericchiang/pup

<details><summary>一言感想</summary><div>
凄いけど、CLI でそこまで詳しく HTML 見なかった。
Shell Script の中で使うかもなぁ。
</div></details>

## **glances**

ネットワーク状況や、プロセス状況などの山程のシステム情報をひと目で確認できるダッシュボード。Python 製。
https://github.com/nicolargo/glances

<details><summary>一言感想</summary><div>
凄いけど、
そして、WSL で動かなかった。
</div></details>

## **osquery**

各種システム情報に SQL でアクセスできる代物。C++ 製。
https://github.com/facebook/osquery

<details><summary>一言感想</summary><div>
凄いけど、覚えることが多くて、何となく使わなくなった。
WSL では参照できる情報に限界があるので、あまり魅力的ではなかったのもある。
</div></details>

## **pet**

スニペット管理。Go 製。
https://github.com/knqyf263/pet

<details><summary>一言感想</summary><div>
凄いけど、Windows 側のとスニペット管理ツールと被っているので、いまいち使わなかった。
</div></details>

## **gif-for-cli**

CLI で Gif が見られる。Python 製。
https://github.com/google/gif-for-cli

<details><summary>一言感想</summary><div>
凄い。
</div></details>

# おまけ

xonsh という偉大なシェルがあるとのことで、後で触ってみたい。
https://github.com/xonsh/xonsh