はじめに
今まではLambda開発はAWSのコンソール画面上からやってたのですが、やっぱりLambdaもローカルで実行したい。テストコードでテストもして、GREENになったらデプロイするようなCI/CDの仕組みを構築したい!となってきたのでawslabs/aws-sam-localを使って本格的にLambda開発をスタートさせようと奮起しました。
ただ、さっそく嫌なポイントが、、、
samコマンドの補完が公式のソースにはない!!
その上、samコマンドのcompletion(補完)がどこをググっても見つからなかった
ので、自分で作ることにしました
できあがったもの
できあがったものはこちらです。ダウンロードして使用してください。
bash-completion
Bashのタブ補完はBashに組み込まれている仕組みです。COMPLETE
というBashの組み込み関数によって定義されてます。
例えばls
を入力してを押すとファイル名が表示される。cd
ならディレクトリ名というようにコマンドに応じたものが設定されています。bash-completionというパッケージを入れておけば、他にも多くのコマンドでタブ補完ができます。
bash補完のHello World
さっそくBash補完を作ってみましょう。まず、はじめにTABを押した時の補完の候補としてfizzとbuzzを表示する関数_helloworld()
をつくってみます。候補のリストをCOMPREPLY
という変数に入れると、補完候補として表示されるようになります。
$ _helloworld() { COMPREPLY=(fizz buzz); }
これをsam
コマンドの補完方法に指定します。
$ complete -F _helloworld sam
これでsam
コマンドは_helloworld
でタブ補完されるようになりました。ここで、
$ sam <TAB>
と打つと、以下のように候補が表示されるはずです。
$ sam
fizz buzz
いい感じですね
_get_comp_words_by_ref()
bash_completion
に含まれている_get_comp_words_by_ref()
という便利関数を使うと、現在カーソルがあるワードは$cur
、ひとつ前のワードは$prev
、ワード数は$cword
という変数に入ります。
こんな感じです。
$ _helloworld()
{
local cur prev cword
_get_comp_words_by_ref -n : cur prev cword
echo
echo cur: ${cur}
echo prev: ${prev}
echo cword: ${cword}
}
$ sam fizz buzz<TAB>
cur: buzz
prev: fizz
cword: 2
この仕組みをうまく使ってsamコマンドの補完候補を設定してやりました。
冒頭にも書きましたが、ソースはこちらです。
bash補完やってみて
今回はsam
コマンドの補完を実装してみましたがこだわってやれば他のコマンドに対してもたくさん補完機能を用意できそうです。
「自作コマンドでちょこっと補完したいなぁ」みたいなケースや、
「dockerコマンドの補完でこのオプションがうまく補完候補に出ないんだよなぁ」といった時に有効活用できそうです。
みなさんもよければ参考にしてみてください。