LoginSignup
3

More than 3 years have passed since last update.

よく実行するコマンドをfzf使ったスクリプトにしたら捗って最高な1年になった話

Last updated at Posted at 2020-12-02

こんにちは

LITALICOでWebエンジニアをしている @tom-ock です。
この記事は『LITALICO Advent Calendar 2020』3日目の記事です。

皆さんエイリアスや自作スクリプト使ってますか?
毎日の開発で使ってるけど、毎回打ち込むには長いコマンドはエイリアスや自作スクリプトにしてしまうと便利です。

コードを書いて効率化するって意味で、自作スクリプトって個人的にはプログラミングの本質な気がして好きなんですよね。
あくまで自分用なので気軽に作れるのもいいんです。

という訳で自作して普段よく使ってる2つのスクリプトを紹介します。

that

前提自分の普段の開発環境の概要を説明すると、
サーバーサイドはRailsdocker-composeで動かし、
フロントエンドはReactwebpack-dev-serverで動かしてます。

それで開発で使ってるコマンドは大体こんな感じです。

  • yarn dev
  • yarn user_dev
  • yarn client_dev
  • yarn admin_dev
  • yarn storybook
  • yarn build-storybook
  • yarn test start
  • docker-compose up -d
  • docker-compose logs -f app
  • docker-compose down
  • docker-compose build
  • docker-compose run --rm app bash
  • docker-compose run --rm app bundle exec rails c
  • docker-compose run --rm app bundle exec rails setup:reindex_all
  • docker-compose run --rm app bundle exec rails db:migrate RAILS_ENV=development
  • docker-compose run --rm app bundle exec rails db:migrate RAILS_ENV=test
  • docker-compose run --rm app bundle exec rails c

他のチームでも同じかと思いますがdocker-compose系のコマンドって結構長くなりがちですよね。
特にチームにジョインした当初は前に実行したことあるのに、「あれしたいんだけど、あのコマンドなんだっけ」となりがちでした。

そこで当初はよく使いそうなコマンドはメモして、メモ見ながらコマンドを実行してました。
でもそもそもメモ使ってコマンド実行すればいいじゃないかと思いついたのがthatコマンドです。

asciicast

that

#!/bin/bash

git_root=$(git rev-parse --show-toplevel)

if [ $? -ne 0 ]; then
  echo 'gitリポジトリ内で実行してください'
  exit 1
fi

those_path="${git_root}/.those"

if [ ! -f $those_path ]; then
  echo "${those_path}が存在しません"
  exit 1
fi

cd $git_root && \
  eval $(cd $git_root && cat $those_path | fzf)

やってることはこんな感じです。

  • 前提、thatコマンドを使う前によく使うコマンドを.thoseというテキストファイルにメモしておく
  • .thoseの中身をfzfで絞り込み、実行したいコマンドを選択
  • 選択したコマンドを実行

fzf使うといい感じに絞り込めて最高ですね。
history使ってコマンドを検索してもいいんですが、あまり使わないけどたまに使うコマンドってhistoryだと埋もれちゃうので、.thoseのテキストファイルとしてメモしています。

テキストファイルとして残していることで、チームに新しいメンバーがジョインした時にコマンド聞かれた時に.thoseを見てさっと出せるのもよいですね。

git-create-pr

自分のチームは基本Issueに紐付ける形でブランチを作成しており、
以下のようにブランチの命名規則が存在します。
feature/{Issue番号}-{実装内容}

毎回issue番号調べてブランチを作成してもいいんですが、Github CLIでIssueの一覧が取得できると知り、ブランチ作成を1コマンドで対話的に作成できるようにしました。

asciicast

git-create-pr

#!/bin/bash

IFS=$'\n'

while : ; do
  selected_issue=$(gh issue list --state open --limit 1000 | fzf)

  echo ''
  echo 'Selected Issue is'
  echo ''
  echo $selected_issue
  echo ''
  echo 'Is it OK?[y/N/q]'

  read input

  if [ -z $input ]; then
    continue
  fi

  if   [ $input = 'Q' ] \
    || [ $input = 'q' ] \
    || [ $input = 'Quit' ] \
    || [ $input = 'quit' ]; then
    exit 1
  elif [ $input  = 'Y' ] \
    || [ $input  = 'y' ] \
    || [ $input  = 'Yes' ] \
    || [ $input  = 'yes' ]; then
    break
  fi
done


number=$(echo $selected_issue | awk -F ' ' '{ print $1 }')


while : ; do
  echo ''
  echo 'Input feature title.'
  echo "  e.g) feature-#${number}-TITLE"

  read title

  if [ -z $title ]; then
    continue
  fi

  branch_name="feature/#${number}-${title}"

  echo ''
  echo 'Branch name will be'
  echo ''
  echo $branch_name
  echo ''
  echo 'Is it OK?[y/N/q]'

  read input

  if [ -z $input ]; then
    continue
  fi

  if   [ $input = 'Q' ] \
    || [ $input = 'q' ] \
    || [ $input = 'Quit' ] \
    || [ $input = 'quit' ]; then
    exit 1
  elif [ $input  = 'Y' ] \
    || [ $input  = 'y' ] \
    || [ $input  = 'Yes' ] \
    || [ $input  = 'yes' ]; then
    break
  else
    continue
  fi
done

git checkout -b $branch_name

やってることはこんな感じです。

  • gh issue listの出力結果をfzfで選択しissue番号を取得
  • 対話形式で「実装内容の文字列」を取得
  • 「issue番号」と「実装内容の文字列」から、新しいブランチを作成してチェックアウト

CLI上でIssueタイトルからIssue番号をfzfで簡単に絞り込めて最高です。

結論、自作スクリプトはfzfを使うといい感じになりますね。
fzfはそのままでも便利ですが自作コマンドの中で使うと捗ります。
また「GitHub CLIで始める快適GitHub生活 - Qiita」でも紹介されている通りGithub CLIは便利ですね。
そのままでも便利ですが、自作スクリプトの中で使っても応用が効きそうなので色々遊んでみようと思います。

おわりに

自作コマンドを作る中で「これ実現するにはどんなコマンド使えばいいんだろう?」と、シェルスクリプトのいい勉強になっています。

スクリプト作成も自分用であればハードルが低いので、あまりシェルスクリプト触らない方は練習がてら是非自作してみてください!

既に何かしら便利なスクリプトを自作している方は是非コメント欄で教えて下さい!

明日は @taro-hiroi さんの記事です!
お楽しみに!

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3