最近コマンドの抽象化・簡略化について色々と学ぶ機会があったのでそれについて書いていきます。
きっかけ
同じチームの人とペアで作業している時に、その人がごく短いコマンドを実行したら
- 特定の作業ディレクトリで VSCode が起動
- ファイル名に今日の日付の入った markdown 形式のファイルが生成される
といったことが実現されており、サッとメモを取りたい時にすぐに VSCode が起動できる状態になっていることに気づき、ちょっと真似したくなったのでやってみました。
実装してみる
上記のことを実行したければ、それらのコマンドをまとめてシェルスクリプトにしてコマンドラインから実行できるようにすればいいので稚拙ながら書いてみたシェルスクリプトがこちら。
# !/bin/sh
cd ~/Documents/markdown
if [ ! -d ./`date '+%Y%m'` ]; then
mkdir `date '+%Y%m'`
fi
code ./`date '+%Y%m'` `date '+%m%d.md'`
単純に cd
で作業ディレクトリに移動して、今月のディレクトリが存在していなければ作成して、今日の日付の markdown ファイルをオープンしています。
で、このシェルスクリプトに実行権限を付与し、 ~/.zshrc
に alias を追加すればいい感じに。
chmod 755 markdown.sh
md
というコマンドを実行すれば上記のシェルスクリプトが実行されるようにしてみます。
alias md='sh ~/markdown.sh'
設定を反映
source ~/.zshrc
この状態で実際に md
と実行してみると、以下のように今月のディレクトリの中で今日の日付のファイルが生成された状態で VSCode が起動しました。
応用
これだけだと味気ないのでもう 1 つ具体例を。
例えば、業務で扱う AWS アカウントが複数あったりして Profile をその都度切り替えなければならないケースは結構あると思います。
S3 にファイルをコピーする場合、
aws s3 cp {file_path} s3://{bucket_name}/
のようなコマンドを実行します。
このコマンドの場合、オプションで Profile の指定を行っていないので実行環境でセットされているデフォルトの AWS アカウントのキーが使用されます。
デフォルトとは別の Profile を使う場合は
aws s3 cp {file_path} s3://{bucket_name}/ --profile {profile_name}
のように --profile
オプションで対象の Profile を指定します。
この場合はそこまでコマンドが複雑じゃないのでそのまま書いて実行してしまえばいいですが、無理やりコマンド化してみます。
# !/bin/sh
function s3cp () {
aws s3 cp ~/test_data/test.txt s3://sample_bucke_name/ --profile $1
}
引数に実行する AWS アカウントの Profile を指定する s3cp
という関数を作りました。
これを .zshrc
などに記述すると実行できるようになります。
この状態で
s3cp sample_profile
と実行すると、実際には
aws s3 cp ./test.txt s3://sample_bucket_name/ --profile sample_profile
というコマンドが実行され、 sample_bucket_name
に ~/test_data/test.txt
がコピーされます。
ちょっと例があんまりよくなかった気もしますが、実行するコマンドの長さを比べるとだいぶスッキリしたと思います。
複雑なコマンドだったり、頻繁に実行するコマンドはこのような形で抽象化することができればコマンド実行時の typo や「このコマンドのオプション何だっけ…」と毎回 help を確認する手間が少しでも省けると思います。
まとめ
今回、冒頭で述べた出来事がきっかけでコマンドの抽象化、簡略化について興味が湧いたのでごく簡単な内容ですがやってみました。
特に markdown の方は作業ログを付けながらやるときには大変便利になりました。
抽象化することで複雑なコマンドをいちいち書かなくてもよくなってコマンドを間違えるリスクも減りますし、誰が実行しても同じコマンドが実行されるようになるのでメリットも多いと思います。