[macOS] Terminalでファイルを監視し更新されたら指定の処理をする – fswatch

  • このエントリーをはてなブックマークに追加
  • LINEで送る

一言で言えばGulpのようなタスクランナーっぽいことをmacOS上でやりたかったのです。

「Gulp入れればいいじゃん」という話もありますが、今回はファイルが更新されたら特定のコマンドを実行したいだけだったので、わざわざNode.jsの環境を整えてJavaScriptをガリガリ書くのはちょっと面倒だったんですよね。

macOSではファイルが更新されたか監視する際にfswatchを使うのが鉄板のようなので、こちらを利用します。


- Sponsored Link -

インストール

HomeBrewで一発です。

$ brew install fswatch

今回は1.15.0が入りました。

$ fswatch --version                                                                                                   fswatch 1.15.0
Copyright (C) 2013-2018 Enrico M. Crisostomo <enrico.m.crisostomo@gmail.com>.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Enrico M. Crisostomo.

簡易タスクランナー

今回はサンプルとして特定のディレクトリ内にあるJavaScriptのファイルが更新されたら、catコマンドで一つに結合するシェルスクリプトを作成します。

コード

Bashです。変数eventには新規に作成、または更新や削除されたファイルやディレクトリの絶対パスが入っていますので、while内でお望みのままに処理します。

#!/bin/bash

#
# 簡易タスクランナー
#

#---------------------------
# 定数
#---------------------------
# 対象のディレクトリ
readonly TARGET_DIR="src/"

#---------------------------
# タスクランナー
#---------------------------
# ディレクトリの存在チェック
if [[ ! -d $TARGET_DIR ]]; then
  echo "[error] Not Found target directory ${TARGET_DIR}" >&2
  exit
fi

# ディレクトリを監視
fswatch -0 $TARGET_DIR | while read -d "" event; do
  # この中に実行したいコマンドを書いていく
  echo ${event}

  # 拡張子が.jsのファイルなら結合する
  if [[ ${event} =~ \.js$ ]];then
    echo "** update bundle.js"
    cat $TARGET_DIR/*.js > bundle.js
  fi
done

fswatchのオプションの-0は、ファイルの区切り文字にNULを使用しxargsやシェルスクリプト内で利用しやすくする物です。

実行方法

パーミションを適当に設定します。

$ chmod 0755 task.sh

あとはそのまま実行してください。

$ ./task.sh

終了する際はCtrl+cです。

$ ./task.sh
^C

参考ページ

このブログを応援する

お寄せいただいたお気持ちは全額サーバ代や次の記事を執筆するための原資として活用させていただいております。この記事が参考になった場合などぜひご検討ください。

PayPal(ペイパル)
PayPalで300円支払う
※金額は任意で変更できます。
※100円でも泣いて喜びますw
※住所の入力欄が現れた場合は「no needed」を選択ください
これまでのご協力者さま
- Sponsored Link -

ご質問やリクエストなどお気軽に。メールアドレスの入力は任意です。書き込みが反映されるまで時間がかかります。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください