Bash
AWS
aws-cli
sam
aws-sam-local

AWS SAM Local samコマンドの補完が公式になかったので、コマンド補完を自作してみた。

はじめに

今まではLambda開発はAWSのコンソール画面上からやってたのですが、やっぱりLambdaもローカルで実行したい。テストコードでテストもして、GREENになったらデプロイするようなCI/CDの仕組みを構築したい!となってきたのでawslabs/aws-sam-localを使って本格的にLambda開発をスタートさせようと奮起しました。

ただ、さっそく嫌なポイントが、、、
samコマンドの補完が公式のソースにはない!!
その上、samコマンドのcompletion(補完)がどこをググっても見つからなかった:cry:

ので、自分で作ることにしました:pencil2:

できあがったもの

できあがったものはこちらです。ダウンロードして使用してください。

samコマンドに続いてキーを押すとこんな感じになります。
sam_completion.gif

bash-completion

Bashのタブ補完はBashに組み込まれている仕組みです。COMPLETEというBashの組み込み関数によって定義されてます。

例えばlsを入力してを押すとファイル名が表示される。cdならディレクトリ名というようにコマンドに応じたものが設定されています。bash-completionというパッケージを入れておけば、他にも多くのコマンドでタブ補完ができます。

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

いい感じですね:v:

get_comp_wordsby_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コマンドの補完でこのオプションがうまく補完候補に出ないんだよなぁ」といった時に有効活用できそうです。

みなさんもよければ参考にしてみてください。