初心者がShellを知りFishとFisherを導入するまで

初心者向けです。

最近Shellについていろいろ勉強をしています。

掲題の通り、Shellって何？からはじまり、[Fish](http://fishshell.com)について、それからプラグインマネージャ初挑戦、[Fisher](https://github.com/jorgebucaran/fisher)についての考察をメモ。

***

## Shellって何？

さて、私の場合はまずここからでした。

OSの中にはカーネルと呼ばれる中心機能があるわけですが、「核」なので私たちが直接対話することはできません。

そこでカーネルさんとお話しするためのツールとしてShellがあります。私たちにインタフェースを提供してくれるソフトウェアです。

てことはターミナルのことかー、って思ったけどまたちょっと違ったみたい。ターミナルはあくまで外側の端末、黒い画面のアレを指します。
私たちがターミナルで打ち込むものに、Bash、Zsh、Fish等のバリエーションがあるわけです。

:pushpin: 2016.2.22追記

> コメントにて補足を頂きましたのでそちらもご参照ください。

## Fishってどう？

私のPCにはBashが入っています。

これは右も左もわからない時に色々教えてくれた先輩がBashユーザーだったのでそのまま‥という理由なのですが、自分でいろいろするようになったら、[Fish](https://fishshell.com/)くんが気になってきちゃいました。
なぜかというと、こんな魅力的なやつなんです。

 * インストールやコンパイルが超簡単!
 * ほとんど設定しなくても充分使える。
 * 補完機能（候補をあげたり、予測変換的な機能）の性能が高い。
 * コマンドでの色つけ機能（エラーは赤とか）がわかりやすい！
 * 速い :fire:

ユーザーフレンドリーというだけあって、イイ！このへんのポイント、初心者には嬉しいですよね。

## Fishを使おう

Fishの導入は、すでにたくさんの素敵な記事があるのでここで細かくは触れませんが、macOSからは`homebrew`で簡単にインストールできますし、英語ですが[公式ドキュメント](http://fishshell.com/)も充実しており[チュートリアル](http://fishshell.com/docs/current/tutorial.html)もありました。

- @ysksさんの[Windows10で快適なfishシェル環境構築](https://qiita.com/ysks/items/6c9d751d9a3b3b1b8020)
- @mtwtk_manさんの[fish-shellを使ってみませんか](http://qiita.com/mtwtk_man/items/dde92d0a6024bc61fa58)
- @futoaseさんの[いいからfish shellつかってみろ](http://qiita.com/futoase/items/32d31cc60a49302eb168)

こちらの記事がわかりやすくてとても参考になりました！

個人的に嬉しいと思ったのは

間違いなく、**親切なヘルプメッセージ！** 

> Fishに於けるエラーメッセージは、何が間違っていたのか、どうすればいいのかを実際にユーザへ伝えるように設計されている。<br>

```shell
foo=bar
```

> fish: foo=bar というコマンドはありません。もしかしたら`set foo bar`という意味ですか？ 変数値を設定する情報を見るためには、`help set`と入力し、ヘルプセクションを見て下さい。


```shell
echo ${foo}bar
```

> fish: `{$foo}`という意味ですか？文字*＄*は変数の初めに用います。*$*に続くブラケットは変数名の一部としては許可されておらず、変数名が0文字になっしまいます。Fishに於ける変数展開についての情報は`help expand-variable`を入力して下さい。

```shell
echo $(pwd)
```

> fish: `(pwd)`という意味ですか？　fishに於いて文字$は変数値を利用する
ときのみ利用します。Fishに於けるコマンド代用に関する情報は、`help expand-command-substitution`を見て下さい。

（以上Wikpediaの[Fish(friendly interactive shell)](https://ja.wikipedia.org/wiki/Friendly_interactive_shell)より抜粋）
というように、説明、ヘルプ、補完に重点を置いているところです。


## 機能を追加しよう

初心者としてはこのへんで既に結構やった感があったりするのですが、更に一歩進んでカスタマイズできるともっと便利になるかもしれません。機能を追加したり、ちょっとかっこいいグラフィックを使えるとうれしいですし。


で、よほど限定的に機能を絞りたくない限りは、一括管理できるフレームワーク OR プラグインマネージャ（[後述](#ref-1)）を使った方がいいです。これは、便利な機能を使えるようになるだけでなく、そのインストールや更新を一括で行ってくれるものです。

逆に言えば、便利なプラグインを見つけても、手動で更新したり、zip形式やtar形式で配布されているものを個別に取り込んだり、GitHubからクローンして自分でローカルのディレクトリに。。。 :mask:

そうですね。入れましょう。


## Fisher

```shell
curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher
```

```shell_session
$ fisher --help
Usage: fisher install <plugins...>  Install plugins
       fisher remove  <plugins...>  Remove installed plugins
       fisher update  <plugins...>  Update installed plugins
       fisher update                Update all installed plugins
       fisher list    <regex>       List installed plugins matching regex
Options:
       -v or --version  Print version
       -h or --help     Print this help message
```

具体的に、導入したら何が良いの？というところですが、Fisherの場合は下記のような特徴があります。

### **プラグインのインストール、更新と削除が超簡単**
すべてのプラグインとテーマを

```
fisher install プラグイン名
``` 

と入れるだけで、ダウンロード、インストールできます。

アップデートしたい時にも。

```
fisher update プラグイン名
```

削除したくなったら、これだけで終わり。

```
fisher remove プラグイン名
```


### **他のフレームワークのプラグインも使うことができる**

一般的にOh My Fishなど、フレームワークのプラグインは、そのフレームワークの中でのみ有効なのに対し、Fisherは自身のプラグインだけでなく、他フレームワークのプラグインも使うことができます。



### **全てにドキュメンテーションがある！**
[公式](https://github.com/jorgebucaran/fisher)から一覧が見られます。圧倒的なドキュメンテーションの量。今のところ全てにあるようです。


以上、かなり簡易的に書きましたので、更に知りたい方はFisherの[公式](https://github.com/jorgebucaran/fisher/)へ。


### Awesome Fish 🍤

ハイレベルな機能のものから、黒い画面がちょっと楽しくなるものまで色々あります。是非自分で[見てみてください](https://github.com/jorgebucaran/awsm.fish)！

初心者なので目を惹くグラフィックに心奪われがちですが、このへんはわかるようになればなるほど便利なのでしょうね。 

## 最後に

今回Shellって何？から始めてみて、初心者でも実際今すぐ使えるかどうかではなく、こういうものをどんどん入れたほうがいいなと感じました。

今は手が届かないスキルだからこそ、知っていたほうが自分の大きな励みになりますね。

次回、実際の使い方等もっと詳しく書いてみたいと思います。

今回は自分のためのメモも兼ねて書きましたので、理解不足な事も多々あると思います。

もしなにかありましたら、コメント等くださると嬉しいです。:wave:


***

<a name="ref-1"></a>
<sup><b>1</b></sup> 本文にあるように、Fisherは他フレームワークのプラグインも使えるという自由度の高さから、他と一線を画すということで、フレームワークではなくプラグインマネージャと呼称しているようです。<a href="#機能を追加しよう">:arrow_heading_up:</a>