こんにちは、バックエンドエンジニアの青山です。
今回はShellスクリプトを書いてコマンド化して業務を少し効率化してみたということについて書きます。今までShellスクリプトはこういう下らないやつしか書いたことがなかったので、どうにか書く機会を作りたいと思ってやってみました。
前提
今開発に関わっている自社メディア(バックエンドはLaravel製)において、フロントエンドのソースコードの変更を
「ビルド済みのCSSとJSファイル、画像ファイルがフロントエンドのリポジトリ内にあるので、それらをLaravelのpublic以下に配置する」
という方法で反映させています。
数分で終わる作業なので正直全く苦ではないのですが、この作業をコマンド一発でできればきっと便利です。なのでそれ用のShellスクリプトを書いてコマンド化してみることにしました。
やりたいことは以下の通りです。
ディレクトリ作成 & PATHを通す
ファイルはどこに置いてもいいと思いますが、管理しやすいように今回はディレクトリを作成してそこに置くことにします。
$ mkdir my_commands
今回の最終目的はコマンド一発で実行できるようにすることです。ディレクトリを作成したらbash_profileを編集してPATHを通しておきます。
$ vim ~/.bash_profile
#追記して変更を保存 export PATH=$PATH:~/my_commands
bash_profileの変更を反映します。
$ source .bash_profile
これでmy_commandsディレクトリ以下にあるファイル名で直接スクリプトが実行できます。
スクリプトを書く
ファイルを作成します。今回はfrontcpという名前にしました。これがコマンド名となります。
VSCodeなどのエディタで編集する場合は.shの拡張子を付けた方がやりやすいです(後で外してください)。
$ cd ~/my_commands $ touch frontcp
スクリプト自体は以下のように記述しました。
今回は
- 関数ごとに分けてmainから実行
- 引数に配列を持たせて取り回す
という書き方をしていますが、やってみた感じ何となくShellスクリプトにおいては悪手な気がします。おそらくもっとそれらしい作法があるのだろうと思いますが、やりたいことが実現できているので一旦OKとします。
コマンドを実行した時にパーミッション周りでエラーが出ないよう、パーミッションを変更したら完了です。
これで、ターミナル上で
$ frontcp
とするだけでファイルが全てコピーされるようになりました。
所感
以下、今回やってみて感じたメリットです。
- 手作業でやっていたことをShellに書き起こせばスクリプト自体をドキュメント代わりにできるので、作業手順などを資料にまとめて管理する手間が少し省ける
- タイポや操作間違いなどの人為的ミスが減る
- Shellスクリプトぐらい当然書けますよね、という無言の圧力に耐性が付く
逆にデメリットとしては以下の点が挙げられるかなと思います。
- 文法は簡単だが見方や考え方が他言語と違うので、他言語の作法に引っ張られると変なところでハマる可能性が高い
- 元々の作業にかかる時間とスクリプトを作成するのにかかる時間を比べると、時間的に元が取れない可能性がある(何百回と作業が発生して初めてスクリプト作成に使った時間がペイできたりとか)
ちなみに元を取るという話ですが、今回の場合は今後200回ぐらい作業が発生すればスクリプト作成に使った時間の元が取れる計算です...。
さいごに
Wizではエンジニアを募集しております。 興味のある方、ぜひご覧下さい。