プロンプト設定用の環境変数 PS1 に追記して、プロンプトの末尾にバックグラウンドジョブの数を表示するようにします。(ジョブ数0なら表示しません)
結論
.bashrc の PS1 を設定している部分より後に以下を追記します。
PS1=${PS1}'$([ \j -gt 0 ] && echo "[\j] ")'
動作環境
以下で動作確認しました。
WSL2 bash : GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Git bash : GNU bash, version 4.4.23(1)-release (x86_64-pc-msys)
説明
すこし丁寧に説明してみます。
まず ${変数名} で変数を展開しています。なので以下は変数 PS1 に文字列 'str' を結合して再代入していることになります。
PS1=${PS1}'str'
また PS1 ではプロンプト用のエスケープシーケンスが使えて、特にジョブ数は \j で参照できます。
以下のようにすればジョブ数を末尾に表示できます。
PS1=${PS1}'[\j] '
ただ、このままではジョブが 0 個のときもジョブ数が表示されてしまい、少し邪魔な気がするので、0 より多いときのみ表示するように条件分岐することを考えます。
ジョブ数を見て条件分岐するワンライナーは次のように書けます。(プロンプト用なので、普通のコマンドラインでは動きません。)
[ \j -gt 0 ] && echo \j
順番に見ると
[ \j -gt 0 ] は \j が 0より大きい場合に1 (真) を返すテストコマンドです。
気持ち悪いですが、左括弧のあとにスペース・右括弧の前にスペースが無いと動きません。仕様です。
&& はアンドで、左側が真の場合のみ右が実行されます。
echo は \j を文字列として返します。
これを PS1 に追加すれば良さそうですが、このまま文字列として追加するとコマンドと解釈されません。
$(command) を使うとカッコ内で実行したコマンドの出力を文字列として扱えます。したがって次のようにすれば上手く行きそうです。
が、まだ正しく動きません。
PS1=${PS1}$([ \j -gt 0 ] && echo \j)
なぜなら $(command) 実行時点の出力が PS1 に保存されるため、\j がその時のジョブ数として解釈され、ジョブ数が変わってもプロンプトの表示が変わりません。
毎度ワンライナーを評価させるには、$(command) を文字列として PS1 に追加すれば良さそうです。
したがって最終的な式は以下の形になります。(見た目を整えるために echo の引数をいじりました。)
PS1=${PS1}'$([ \j -gt 0 ] && echo "[\j] ")'
参考元
ググったらやりたいこととピッタリの記事が出ました。
https://stackoverflow.com/questions/12646917/show-job-count-in-bash-prompt-only-if-nonzero
コピペすればいいところを手書きしてみたら、$() のクォテーションを忘れるなどして割とハマり。
そのおかげで知見が溜まったのでメモしました。
↧