aws

AWS CLI 補完機能の設定 と Macでの「complete:13: command not found: compdef」 の対応

しばらく複数環境を運用していてAWS CLIの サブコマンド configure を打つのが辛くなってきたので補完機能をいれてみました。

スポンサーリンク

手順

Linux

CLIインストール

EC2 のRedhat & Rootユーザーで実施しました。

# yum install -y unzip
# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# unzip awscliv2.zip
# ./aws/install


補完機能(completer)も自動的にインストールされます。

# which aws
/usr/local/bin/aws
# which aws_completer
/usr/local/bin/aws_completer

補完機能設定

いつでも補完機能を使用できるようにログイン時に自動で設定されるようにしておきます。

# echo -e "\ncomplete -C '/usr/local/bin/aws_completer' aws" >> .bashrc 
# . .bashrc 


設定が完了したので試してみます。

サブコマンドの最初の方の文字を入力して TAB を押すと候補が表示されます。aws[space] の状態で何も入力せずTABを押すとサブコマンド全部の候補がでます。238個だと。。

# aws con
configservice       configure           connect             connectparticipant  

# aws 
Display all 238 possibilities? (y or n)
accessanalyzer                deploy                        kafka                         redshift
acm                           detective                     kendra                        redshift-data
...

(そしてconfigure がかなり打たないと完全に補完されない。。あまり辛さ変わらなかった。。orz

Mac

CLIインストール

$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /

補完機能設定

Macデフォルトシェルのzshの場合、bashの補完設定用コマンドのcompleteがないので、autoloadで関数として利用できるようにします。
なお autoload では-U を付けてalias誤爆防止したほうがいいようです。

$ cat <<EOF >> .zshrc 

autoload -Uz compinit && compinit
autoload -U bashcompinit && bashcompinit
complete -C '/usr/local/bin/aws_completer' aws
EOF
$ source .zshrc 

余談

公式マニュアルの通りMacで

autoload bashcompinit && bashcompinit

のみの設定ですすめると

% source .zshrc                           
complete:13: command not found: compdef
% 

とエラーが出力されました。 調べるとcompdefが

% echo $fpath
/usr/local/share/zsh/site-functions /usr/share/zsh/site-functions /usr/share/zsh/5.7.1/functions
%

/usr/share/zsh/5.7.1/functions 配下のcompinitで定義されていたため bashcompinit(この中でcomplete が呼ばれている) の前に compinit をautoloadすることで解決しました。

またこの記事作成中に気づいたのですが、自分の.zshrcに

autoload -U +X bashcompinit && bashcompinit
complete -o nospace -C /usr/local/bin/terraform terraform

が入ってました。どうやらterraform -install-autocomplete のterraformの補完で入ったようです。

参考

(人-)謝謝

公式マニュアル コマンド補完
.zshrcで見かけるautoloadの意味と使い方
zshのcompinitに指定してるautoloadのオプション -Uz について