はじめに
AWS CLI でリソースを作ったり消したりしていたときのこと。コマンドを実行したら、画面いっぱいに出力が出て——そのあと、ターミナルが固まりました。
Enter を押しても反応なし。次のコマンドを貼っても、なぜか変なエラーが出るだけ。
「コマンド失敗した?壊した…?」と一瞬あせりました😅
でも実際は、コマンドは成功していました。固まって見えた正体は、まったく別のものでした。同じく「AWS CLI で急に固まった」人のために残します。
環境
- macOS / zsh
- AWS CLI v2
起きたこと
例えば、こういうコマンドを実行したとします。
aws rds describe-db-instances --region ap-northeast-1
すると、出力がずらっと出たあと、画面の一番下が : で止まり、いつものようにコマンドを入力できない状態になりました。
Enter を何度押しても進まない。仕方なく次のコマンドを貼ったら——私の場合は、次のような表示が出ました。
X=: No such file or directory (press RETURN)
意味の分からないエラー。h を打ってしまったときは、なぜか操作ヘルプの画面が出てくる始末でした。
原因
固まっていたのではなく、ページャ(less)の中に入っていただけでした。
AWS CLI v2 では、ページャが有効になっていると、長い出力が less(ページャ)に表示されることがあります。画面下の : は、less が「次の操作を待っています」という合図。つまりその時点で、キー入力はシェルではなく less への命令として解釈されます。だから——
-
Enter では抜けられない(
lessを終了するキーはq) - 次のコマンドを貼ると、その文字が**
lessのコマンドとして誤解**される(h→ ヘルプ表示、貼り付けた文字列 →X=: No such file or directory)
コマンド自体は成功していて、その出力を less が表示していただけだったんですね。
解決
まず、固まったときは q を押す。これでシェルに戻れます。
そのうえで、毎回ページャに入らないようにするのが楽です。
# このターミナルでページャを無効化
export AWS_PAGER=""
ずっと無効にしたいなら、シェルの設定ファイル(~/.zshrc など)に同じ行を足せばOK。1回だけ無効にしたいなら、コマンドに付ける方法もあります。
aws rds describe-db-instances --region ap-northeast-1 --no-cli-pager
なお、ページャ中に複数行コマンドを貼ると、意図しない文字入力として扱われることがあります。まず q で抜けてから、必要なら1行にまとめて実行すると安全でした。
学び
- 画面下が
:で止まったら、固まりではなくページャ(less)に入っている合図。 -
抜けるのは
q。Enter ではない。 ページャ中の貼り付けは、文字がlessのコマンドとして誤動作する。 - AWS CLI v2 でページャが鬱陶しければ、
export AWS_PAGER=""で無効化できる。
おわりに
「固まった!壊した!」と思ったら、まず q——を確認です😅 AWS CLI を触り始めて同じところで止まった人の役に立てば嬉しいです🙌