UNIX系OS ( Mac / Linux / FreeBSD )のシェルコマンドに関する各種メモ書き

fzf で bash / zsh のコマンドを便利にする

● mac でのインストール

fzfbat を インストールします

brew install fzf
brew install bat

● スクリプトのダウンロード

以下のURLからbashまたはzsh用のファイルをダウンロードします。
https://github.com/junegunn/fzf/tree/master/shell
ホームフォルダの /fzf/ 以下に保存します

● スクリプトの設定

.bash_profile に 以下のように記述します ( bash の場合 )

# FZF
source ~/fzf/completion.bash
source ~/fzf/key-bindings.bash

● 使い方の例

● 1. コマンドの履歴をfuzzyサーチして実行する

Control + R

を押すと コマンドの履歴が表示され、fuzzyサーチして実行することができます。

● 2. SSHを一覧から選択して接続できるようにする「fssh」 コマンドを作成する

# FZF (ssh)
function fssh {
  t=$(cat ~/.ssh/config | grep 'Host ' | cut -f2 -d' ' | fzf --reverse --preview "cat ~/.ssh/config | sed -ne '/^Host {}$/,/^\s*$/p'")
  if [ -n "$t" ]; then
    echo "ssh $t" 
    ssh "$t"
  fi
}
fssh

接続先一覧からエンター押すと接続できるようになります。

● 3. package.jsonのscriptsを一覧から選択してyarnで実行する「fy」 コマンドを作成する

まず jq をインストールします

brew install jq
function fy() {
  if [ ! -f "package.json" ]; then
    echo "Error: package.json not found"
    return 1
  fi

  if [ -f "yarn.lock" ]; then
    local pm=yarn
  else
    local pm=yarn
  fi

  local script=$(cat package.json | jq -r '.scripts | to_entries | .[] | .key + " -> " + .value' | fzf --reverse)
  if [ -n "$script" ]; then
    SCRIPT=(${script/ -> / })
    echo ${pm} run ${SCRIPT[0]}
    history -s ${pm} run ${SCRIPT[0]}
    ${pm} run ${SCRIPT[0]}
  fi
}
fy

● 4. package.jsonのscriptsを一覧から選択してnpmで実行する「fn」 コマンドを作成する

function fn() {
  if [ ! -f "package.json" ]; then
    echo "Error: package.json not found"
    return 1
  fi

  if [ -f "yarn.lock" ]; then
    local pm=npm
  else
    local pm=npm
  fi

  local script=$(cat package.json | jq -r '.scripts | to_entries | .[] | .key + " -> " + .value' | fzf --reverse)
  if [ -n "$script" ]; then
    SCRIPT=(${script/ -> / })
    echo ${pm} run ${SCRIPT[0]}
    history -s ${pm} run ${SCRIPT[0]}
    ${pm} run ${SCRIPT[0]}
  fi
}
fn

● 5. docker コンテナを一覧から選択して中へ入る「fd」 コマンドを作成する

function fd(){
  local SH="bash"

  type docker >/dev/null 2>&1 || {
      echo "docker not found" >&2
      exit 1
    }
  type fzf >/dev/null 2>&1 || {
      echo "fzf not found" >&2
      exit 1
    }

  local HASH=$(docker ps | fzf --reverse --header-lines=1 --select-1 --query="${1:-}" | awk '{ print $1 }')
  history -s docker exec -it "${HASH}" "${SH}"
  docker exec -it "${HASH}" "${SH}"
}
fd

● package.jsonを 一覧を表示して実行する(npm yarn 自動選択)

brew install jq

( bash用です )

# package.json実行 (brew install jq)
function fp() {
  if [ ! -f "package.json" ]; then
    echo "Error: package.json not found"
    return 1
  fi

  if [ -f "yarn.lock" ]; then
    local pm=yarn
  else
    local pm=npm
  fi

  local script=$(cat package.json | jq -r '.scripts | to_entries | .[] | .key + " -> " + .value' | fzf)
  if [ -n "$script" ]; then
    SCRIPT=(${script/ -> / })
    echo ${pm} run ${SCRIPT[0]}
    history -s ${pm} run ${SCRIPT[0]}
    npm run ${SCRIPT[0]}
  fi
}

● シェルにファイルのプレビューを追加する ( FD clone のような )

以下のURLから preview.sh をダウンロードする https://raw.githubusercontent.com/junegunn/fzf.vim/master/bin/preview.sh

~/fzf/ に保存し、 実行権限を付与しておきます

chmod 0755 preview.sh

.bash_profile に以下を追加する

# FZF (fd)
function fd {
	file=$(find * | fzf --preview "preview.sh {} 2> /dev/null || ls {}")
  echo $file
  echo $file  | pbcopy
}

● makeの一覧を表示して実行する

# fmake
function fmake() {
  if [ ! -f "Makefile" ]; then
    echo "Error: Makefile not found"
    return 1
  fi

  local script=$(make help | fzf --reverse --ansi)
  if [ -n "$script" ]; then
    SCRIPT=(${script/  {3,}/ })
    echo make ${SCRIPT[0]}
    history -s make ${SCRIPT[0]}
    make ${SCRIPT[0]}
  fi
}

● 他にも便利な使い方を紹介されている方たちが。

仕事が遅い人は絶対に知らないワンライナー10選 - Qiita
https://blog.tsub.me/post/move-from-peco-to-fzf/
https://journal.lampetty.net/entry/terminal-env-from-peco-to-fzf
https://zenn.dev/fruitriin/scraps/5aa42e37bc57cb

No.2315
02/01 14:44

edit