Mobile Factory Tech Blog

技術好きな方へ!モバイルファクトリーのエンジニアたちが楽しい技術話をお届けします!

インストールしてすぐ使えるfish shell入門

こんにちは!新卒1年目エンジニアのid:dorapon2000です。最近暑いですね。

さっそくですが、シェルを便利にカスタマイズしたい気持ちはあるけれど面倒だなぁとか、そろそろbash以外のシェルにも手を伸ばしたいという方はいるのではないでしょうか?今回紹介するfishはデフォルトですでに便利なので、入門者であっても導入しやすいですし、設定ファイルをいじりたくない人にもうってつけです。私自身もoh-my-zshを長らく使っていましたが、fishでいいじゃんとなった一人です。一方で、bash構文が使えないことやfish独自の書き方に抵抗がある人は向いていないので注意です。

本記事ではfishの他のシェルにはない魅力的な特徴と使い方をgif付きで紹介していきます。また、コマンドヒストリーの検索が便利になるplugin-pecoも一緒に紹介します。

fish公式:https://fishshell.com/

目次

  • 向いている人
  • fishインストール手順
  • fishの特徴
  • 各特徴説明
  • bashとの違い
  • 使ってみての感想
  • plugin-peco
  • plugin-pecoインストール手順
  • まとめ

インストール手順

# fishのインストール (ubuntu)
sudo apt-add-repository ppa:fish-shell/release-3 # fish 3を入れるために必要
sudo apt update
sudo apt install fish
fish --version

# fishのインストール(mac)
brew install fish
fish --version

# デフォルトシェルにする場合
echo $(which fish) | sudo tee -a /etc/shells
chsh -s $(which fish)

fish

fishのインストールはここまでです。以下は私が使っているテーマのインストール。

# パッケージマネージャfisherのインストール
curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisherman

fisher git_util
fisher rafaelrinaldi/pure

fishの特徴

fishの公式では6つの特徴をあげています。いくつかピックアップしてみていきましょう。

  • オートサジェスト
  • 今風のスクリプト構文
  • manを使った補完
  • 24ビットカラー
  • ウェブからの設定変更
  • 直感的な操作性

オートサジェスト

過去のコマンド履歴を利用して、入力した文字と一致する最後のコマンドをうっすらと表示してくれます。

f:id:dorapon2000:20200811173232g:plain

実行できないコマンドを入力したときに赤くなるのも嬉しいですね。

f:id:dorapon2000:20200806173135p:plain

manを使った補完・直感的な操作性

fishではmanを読み込んでオプションの補完ができるようになります。gitのコマンドはもちろん、manがあるコマンドであればどれでも補完可能です。

f:id:dorapon2000:20200812170723g:plain

ウェブからの設定

fishではウェブからテーマやプロンプトの設定ができ、環境変数なども見られます。ただし、ブラウザがない環境だとエラーがでます

fish_config  # ブラウザが立ち上がる

テーマの設定

f:id:dorapon2000:20200811180458g:plain

プロンプトの設定

f:id:dorapon2000:20200812164717g:plain

環境変数も見られる

f:id:dorapon2000:20200814170637p:plain

fishスクリプト

fiやesacといったシェルスクリプト独特な書き方から今風の書き方になっています。正直なところ、Unixにデフォルトで入っていないfishでスクリプトを書く気持ちにはなれていません。

function detect_os
    switch (uname)
        case Linux
            echo Hi Tux!
        case Darwin
            echo Hi Hexley!
        case FreeBSD NetBSD DragonFly
            echo Hi Beastie!
        case '*'
            echo Hi, stranger!
    end
end

bashとの違い

bashとは似ているようで、違う部分も多々あります。

同じ

  • パイプ |
  • 条件式 &&, ||, !
  • []
  • 入出力 >, >>, <

違う

  • 設定ファイルの場所は、~/.bashrcではなく~/config/fish/config.fish
  • 環境変数の設定はexportではなくset
    • set -x PATH /path/to/bin $PATH
  • 数値計算はletや(())ではなくmath
    • math 1 + 1
    • mathはfishの組み込み関数
  • コマンド置換は$()から()
    • echo (math 1 + 1)
    • <()も不可、代わりにpsub

以下の記事はbashとの違いについて詳しく書かれていて参考になります。

シェル芸人のためのfish入門 - Qiita

使ってみての感想

普段使っている中では、bashとの違いを意識することは環境変数の設定(set)くらいです。既存のシェルスクリプト自体はbashに渡したり、シェバングを書けば良いので気になりません。たまにパイプでつなげまくるワンライナーを書いてfishで動かないことがありますが、そのときだけbashに切り替えています。fishを使い始の頃はFAQが助け舟になるでしょう。

fishを使っていて困ることは、ググって入力するコマンドが動かないですね。例えば、ssh-agentなんかはつまづきポイントです。

# bash
eval `ssh-agent`

# fish
eval (ssh-agent -c)

plugin-peco

最後に1つだけ、plugin-pecoというプラグインだけおすすめしておきます。plugin-pecoを使うにはpecoコマンドも必要です。

f:id:dorapon2000:20200813173546g:plain

  • Ctrl-Rを押すとコマンドヒストリーが開き、1タイプごとに絞り込める
  • さらにCtrl-Rを押すことで絞り込みの種類を変更できる

fishでも↑↓キーでヒストリーを順に表示できますが、一覧表示されると検索効率がぐんとあがります。

pecoとplugin-pecoのインストール

# pecoのインストール(ubuntu)
sudo apt install peco

# pecoのインストール(mac)
brew install peco

# plugin-pecoをインストール
fisher install oh-my-fish/plugin-peco
vim ~/.config/fish/config.fish

# 以下を書き加える
function fish_user_key_bindings
    bind \cr peco_select_history
end

# シェル再起動

まとめ

  • 強力な補完
  • 導入コストも学習コストも低い
  • pecoと組み合わせてらくちんヒストリー検索

ここまで読んでくださりありがとうございました。 この記事をきっかけにfishの魅力に気づいて、fishを使う人が増えることを期待します!

リモート入社した新卒が3ヶ月で学んだこと

こんにちは!4月に入社したエンジニアのDozi0116です。
5月に駅メモ!開発チームに配属されてから毎日コードと戦っています。
今回は自分が入社して1ヶ月の新人研修・技術研修 + 2ヶ月の現場配属で試したことや学んだことを紹介します。

意思疎通が難しい

この3ヶ月で1番の問題は意思疎通が難しいことでした。
元から物事を伝えるのが苦手な上、リモートで会社には一度も出社しておらず同僚の誰にも一度も会っていないため、質問はもちろん、自分の進捗を報告することすらできなかったので、コードレビューのタイミングで指摘されて大幅に書き直すハメになったり、認識のすり合わせが十分にできておらず完成後にお互いの認識の違いに気が付いたりと、意思疎通ができていないことが原因の問題が多々発生しました…。
また、リモートということもあり、相手の空気感や調子が感じ取れない状態で意思疎通をするのはすごくハードルが高いと感じました。

3ヶ月で試したこと

そんな中、少しでも円滑に意思疎通をしようといろいろなことを試してみました。次に紹介するのは、その中で学びが大きかった3つです。

進捗を定期的に書き出す

まずは自分の考えをまとめられるようになろうと思い、毎日自分の作業スレッドを立てて、そこに定期的に自分が今ある状態を書き出すことにしました。

f:id:Dozi0116:20200701180154p:plain:w400
とある日に正規表現で悩んでいた時の作業スレッド

何かを見て得られた知見、実行して得られた結果に対する感想、単なるメモなどをとにかく書きまくる。
これをやったことで、長時間同じことを書いている = 自分が詰まっていることに気が付いたり、いざ質問しようと思ったら、いろいろ書き出しているおかげですでに質問の下地が出来上がっていたり、チームの全員が見られる位置でこのスレッドを作っているため、本当に困った時はこの流れを見てもらうことで質問の意図が伝わりやすかったりと複数の場面で役立ちました。

雑談を毎日10分する

メンターの方に意思疎通のハードルが高く感じると話したら、毎朝好きな話をしていい雑談の時間を10分設けてもらえました。

雑談で親睦を深めることで話しにくさを減らせました。 また、リモートだと相手のタイミングを掴むことが難しいため、業務中に「今は相談できるタイミングなのかな…?」と戸惑うこともあります。ですが、この時間は自分のために確保してくれる時間だと考えたら、様々なことが聞きやすくなって質問のハードルを大きく下げられました。(なんでも答えてくれるメンターさんには本当に感謝です!)

細かいことでもすぐにビデオ通話をする

先述した失敗を踏まえて、最近は少しでもわからないところがあったらなるべく通話をつないで、話し合いながら認識や方針のすり合わせを行うようにしています。

先輩の時間を奪ってしまう後ろめたさはあるけれど、とても親切に聞いてくれ、親身に考えてくれるのでありがたいです。
さらに、認識の違いが減りレビューにかける時間が大幅に減ったので、事前に相談をする能力はコードを書く能力より大事かも?と思うようになりました。

まとめ

簡単に3ヶ月で試したことや学んだことを紹介しました。

この3つを実施することで、意思疎通がしやすくなりました。

  1. 進捗を定期的に書き出す
  2. 雑談の時間を取り入れる
  3. 細かいことでもすぐにビデオ通話をする

これからどんどん先輩たちと意思疎通していって、コーディング知識やそれ以外の事もたくさん蓄えていき、いち早く一人前のエンジニアとして貢献できるように今後も頑張っていきたいです!