Posted at

zsh でコマンドが失敗したときにプロンプトの色を変えてエラーを知らせる

More than 5 years have passed since last update.

シェルでコマンドを呼び出したときに、コマンド実行に失敗した場合は終了ステータスとして0以外を返すルールになっている。

% ls -z

ls: 無効なオプション -- 'z'
Try 'ls --help' for more information.
% echo $?
2

上の例のように終了ステータスは echo $? で確認できるんだけど、コマンドが成功したかどうかによってプロンプトの色を変えるようにもできるので紹介する。


こんな感じで.zshrcに書いておけばOK。

autoload -Uz colors

colors
PROMPT="%(?.%{${fg[green]}%}.%{${fg[red]}%})[%n@%m]%{${reset_color}%} %# "

zsh_prompt2.png

前回のコマンド呼び出しに成功したときは緑、失敗したときは赤になってる。プログラムのコンパイルとかしたときに成功したかどうかが分かりやすいので便利。


解説

%(?.xxx.yyy) という形式の記号を使ってる。これをプロンプト文字列として使うと「前回の終了ステータスが0ならxxx、0以外ならyyy」という意味になる。今回の例では「xxx = %{${fg[green]}%}」、「yyy = %{${fg[red]}%}」という風に違う色の指定を埋め込んでいるので、前回のコマンド呼び出しが成功したかどうかによって色が変わるようになってる。

詳細については man zshmisc(1) の「CONDITIONAL SUBSTRINGS IN PROMPTS」の「%(x.true-text.false-text)」を参照。