軽い気持ちで fish に入門してみた。(install から alias PATH の設定まで)

## はじめに
最近、自分らのチームに導入していただいた Linux Server に
GPU 付きの KVM を立てられるように環境構築をしているのですが、

これがどうにもうまくいかず、作業が煮詰まってきたので、
気分を変えるために shell を変えよう! (意味不明) という気持ちになって、
軽い気持ちで fish を使い始めました。

その時の使い方や設定に関するメモを残したものです。

以降、面白そうなことがわかったら追記予定です。

# 軽い気持ちで始める fish (install から)
* 以降本文です。

* 何よりまずは install です。

    - `$ sudo apt install fish`

    - OS は ubuntu を使っているので apt で install します。

        + ここは `$ fish` として、fish がまだインストールされていない場合は、出力でサジェストされるのではないかと思いますので、迷ったらまず fish を実行してみてください。

## 他のシェルから一時的に fish を使う
* `$ fish` で実行

## fish の 設定ファイル
* `ls -A` してもないので作成
    - `touch ~/.fishrc` するのかと思ったら、別で指定する場所がある?!
    - ちなみに ユーザのホームディレクトリ下に `.fishrc` とか `fish.conf` みたいなファイルを作って `source` すれば動くのかもわかりませんが、現段階では未検証です。

## 書く場所が他の shell と違うという情報
* [こちらを参考にさせていただきましたところ](https://www.pandanoir.info/entry/2017/11/03/190000)

> * どこに設定を書くのか分からない
    - そもそも設定ファイルの場所が大きく異なります。
    - `.zshrc` や `.zprofile` のように `.fishrc`、`.fishprofile` なのかと思っていました。
    - しかし、実際は全く違っていて `~/.config/fish/config.fish` という1つのファイルに設定を書きます。

* とのことでしたので、まずはこの設定ファイルがあるか確認しに行きます。

    - `~> ls .config/fish/fishd.PcName`

    - というファイルがありました。

        + ここで **注意** なのですが、自分で alias などを登録する場合は、 **ここではなく、自分で設定ファイルを新しく作る** ことになります。
        + このファイルには 
            
            ```
            # This file is automatically generated by the fish.
            # Do NOT edit it directly, your changes will be overwritten.
            ```

        + のように、「いじるな」って書いてありました。
        + 最初ここに書いて動かなくて、がっつり無視してごめんなさい..という気持ちになりました。



## alias を登録してみる
* 設定ファイルを `.config/fish/` 下に新しく作った。

    - `user@PcName ~> touch .config/fish/config.fish`

    - `user@PcName ~> emacs .config/fish/config.fish`


        + 以下の内容を記載 (エディタはお好みで..)

            ```
	    # alias
            alias l 'ls -CF'
	    ```


    - ちなみに、なんで `l` を登録したかというと `la` とか `ll` とかは既に動く(割り当てられている) からです。 

    - あまり alias とか登録してない初心者() なので、温かい目で見てほしいです..






* どう読み込めばいいのかわからないので shell 再起動してみる。

    - `~> exec $SHELL -l`

    - 怒られた。

        ```
	fish: Variables may not be used as commands. In fish, please define a function or use 'eval $SHELL'.
	exec $SHELL -l
	         ^
	```

        + 「変数 `$SHELL` が未定義です」だと..

* `user@PcName ~> echo $SHELL`

    ```
    /usr/bin/fish
    ```

    - いや入ってるじゃんか。

    - `Variables may not be used as commands`
        + え? 変数をコマンド内で使えないの..?


    - `sudachi@sudachi-dynabook-R734-M ~> exec /usr/bin/fish -l`

        ```
	Welcome to fish, the friendly interactive shell
	```

	+ ほんとだ。指定したら実行できた。


    - ちなみに、以下の方法で、設定ファイルを再読み込みできます。

        + `user@PcName ~> source .config/fish/config.fish`


    - `user@PcName ~> l`

        ```
	Desktop/    backup/  doc/              jupyter-working/  public_html/
	anaconda3/  dls/  examples.desktop  memo/             share/
	```

        + 動いた!!

* ということで alias の登録方法はわかった。(こととする)


* 数少ない alias を登録

    - 僕が登録している alias はせいぜいこれくらいなので、登録しておきます..

        ```
	# alias
        alias l 'ls -CF'
	alias rm "rm -i"
	alias cp "cp -i"
	alias mv "mv -i"
	```

## PATH の設定
* `.bashrc` や `.zshrc` とは構文が異なる、そうです。

    ```
    # PATH
    set -x PATH /path/to/hogehoge $PATH
    ```

    + のように書く、そうです。




### とりあえず、anaconda を動かすまで作業をする。
* 個人的に Python をよく書くので、anaconda が使えるようにしたいです。

* conda が動くように PATH を通す

    - 現状 : `user@PcName ~> conda`
 
        > conda: コマンドが見つかりません

    - `.bashrc` の PATH を見に行ってみる

        ```
	export PATH="/home/user/anaconda3/bin:$PATH"
	```

    - `.config/fish/config.fish` に以下の内容を追記してみる。

        ```
	set -x PATH /home/user/anaconda3/bin $PATH
	```

    - `user@PcName ~> conda -V`

        > conda 4.7.10

        + お。いいね。

* conda activate できるように `conda init` する。

    - `user@PcName ~> conda init fish`

        ```
	modified      /home/sudachi/.config/fish/config.fish
	```

        + modify する場所はいい感じです。

    - `user@PcName ~> source .config/fish/config.fish`

        ```
        sudachi@sudachi-dynabook-R734-M ~>                        (base)
	```


        + え。そこに出るの..??

    - `user@PcName ~> conda activate tenfl                (base)`

        ```
	user@PcName ~>                       (tenfl)
	```

    - `user@PcName ~> which python                                   (tenfl)`

        ```
	/home/user/anaconda3/envs/tenfl/bin/python
	```

	+ 使えてるし..
	+ カッコ悪い感と、見にくい感は否めないですが、まあいいか。


* とりあえず、使えることには使えるようなのでこれにて終了。

### 注意
* `conda init fish` をした後、`source` をしてもうまく conda activate などができない場合があります (正直言って理由は謎..私にはよくわからない)
* その場合は `conda init` で追記された内容を全て消し、conda 自体の PAHT の下に以下のように追記してみてください。 

   ```
   set -x PATH /home/user/anaconda3/bin $PATH
   source (conda info --root)/etc/fish/conf.d/conda.fish
   ```

   - 変更後は `source ~/.config/fish/config.fish` をお忘れなく。
   
    - 最初の `set -x PATH /home/user/anaconda3/bin $PATH` を消してしまい、fish に login すると返答が返って来なくなるかもしれませんので注意してください。



## 実用に向けてはまだまだ勉強中...
* shell の設定って、とりあえず 「alias」 と 「PATH」 が書ければ概ねどうにかなるやろ、と思っている過激派初心者なので、今回はその２点を中心にまとめてみました。


* 上段でも書きましたが、面白いことがあれば追記予定です。
    - 詳しい方おられましたら、ご教授お待ちしております..

## Links
* [fish を導入](http://ryskosn.hatenadiary.com/entry/2017/01/02/185151)
* [fish shellのPATH設定](https://qiita.com/ledsun/items/8ca1a450b21c8ebc9670)
* [zshからfishへ移行してみた](https://www.pandanoir.info/entry/2017/11/03/190000)