th0x0472.log

アクセスカウンタ

zoom RSS コマンドが正常終了したらプロンプトに「たのしー」か「うれしー」か「すごーい」をしゅつりょくする

<<   作成日時 : 2017/03/03 22:33   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

退屈ですが、念のためのお約束です。

この記事で紹介している内容を実行してどのような結果になっても、私は責任を取りません。

こういうノリの記事は初めてでちょっと緊張します。

対象の環境は日本語が通るbashとターミナルです。私が普段使ってるから、それだけの理由です。zshでも同じ事が出来ると思いますが、調べていないので具体的な方法まではご紹介できません。

細かいことを書く前に、先に結論を書きます。
これを ~/.bashrc にコピペしておけば、プロンプトが次のようになります。

コピペする内容
PS1='[\u@\h $(R=$?; T=("たのしー" "うれしー" "すごーい"); [ $R -eq 0 ] && echo "「${T[$(($RANDOM % 3))]}」" ) \w] \$ '

プロンプトの例
[th0x0472@localhost 「たのしー」 ~] $
[th0x0472@localhost 「うれしー」 ~] $
[th0x0472@localhost 「たのしー」 ~] $
[th0x0472@localhost 「たのしー」 ~] $ /bin/false
[th0x0472@localhost ~] $
[th0x0472@localhost ~] $ /bin/true
[th0x0472@localhost 「たのしー」 ~] $
[th0x0472@localhost 「すごーい」 ~] $


一時的に変更するなら、直接PS1を変更してやればOKです。

[th0x0472@localhost ~]$ PS1='[\u@\h $(R=$?; T=("たのしー" "うれしー" "すごーい"); [ $R -eq 0 ] && echo "「${T[$(($RANDOM % 3))]}」" ) \w] \$ '
[th0x0472@localhost 「すごーい」 ~] $
[th0x0472@localhost 「うれしー」 ~] $


一応、一通り説明していきますよ。

bashで表示されるプロンプトは PS1というシェル変数によって決まります。この変数の内容を変更することで、プロンプトを変更することが出来ます。

上記でPS1に代入した内容のうち、最初と最後の [ ] と @ はそれらの文字そのもので、そのまま表示されます。

\u と \h は、それぞれ現在のユーザ名とホスト名に展開されます。 \$ はUIDが0なら # に、そうでなければ $ になります。rootになるとプロンプトが変わるアレですね。
他にも、bashがその時々にあった文字列に展開してくれる記述があります。定義されている記述については、bash のmanページの “PROMPTING” の項目や bashのマニュアルの ”6.9 Controlling the Prompt” で説明されてます。

$(command) はお約束のコマンド置換です。プロンプトにコマンド置換も埋め込めちゃうんだね、すごーい。この中身について説明していきます。

まず 直前に実行されたコマンドのexit status を取得して変数Rに代入しています。これを後回しにすると、 $? の内容がコマンド置換の中で実行したコマンドのexit status に置き換えられてしまい、コマンドプロンプト直前のコマンドの値を反映できません。

T=(“うれしー” ...) は、配列の初期化です。 ${T[0]} に ”うれしー”、 ${T[1]} に ”たのしー”、${T[2]} に ”すごーい” を代入しています。このどれか一つを正常終了時にプロンプトに出力します。

[ expression ] && command1 || command2 は条件分岐です。
expression が true なら command1 が、そうでなければ command2 が実行されます。

ここでは、変数R の値が 0 なら 配列T のいずれかを出力します。変数R の値が 0 でないなら何も出力しません。

配列T のどの要素を出力するかは、$RANDOM によってランダムになっています。$RANDOM は、それを参照すると bashがその都度 0から32767までの範囲の整数をランダムに生成してくれる変数です。$(( expression )) はbashが中の式を計算してくれます。要は、 $RANDOM で取得した値を3で割った余り、0,1,2のいずれかになるようにしています。

ついてに、コマンドが複数行にわたるときのプロンプトも > だけで何とも味気ないので、これも変えてみます。

[th0x0472@localhost 「たのしー」 ~] $ PS2="はやくはやくー > "
[th0x0472@localhost 「うれしー」 ~] $ FOO="foo
はやくはやくー > bar"
[th0x0472@localhost 「たのしー」 ~] $ echo $FOO
foo bar
[th0x0472@localhost 「うれしー」 ~] $


説明するまでもないですね。
もちろん、顔文字もいけます。

[th0x0472@localhost 「たのしー」 ~] $ PS1='[\u@\h $(R=$?; T=("たのしー" "うれしー" "すごーい"); [ $R -eq 0 ] && echo "「${T[$(($RANDOM % 3))]}」" || echo " m9(^Д^)" ) \w] \$ '
[th0x0472@localhost 「たのしー」 ~] $ /bin/false
[th0x0472@localhost m9(^Д^) ~] $ /bin/true
[th0x0472@localhost 「たのしー」 ~] $



PS1, PS2 に代入する内容を、' (シングルクォート)でくくるか、” (ダブルクォート)でくくるかについて、補足します。個人的には、 ' (シングルクォート)をお勧めします。
" (ダブルクォート)でくくると、 コマンド置換やその中の変数の $ などを \ でエスケープしてやる必要があります。記号を使った顔文字も同様です。次のような簡単なものなら良いのですが、ちょっと複雑にしようとすると、期待した動作をしなかったり、ひどいとプロンプトを表示する度にエラーメッセージが表示されるようになってしまいます。
それが面倒なので、' (シングルクォート)でいいじゃない、と考えてます。

[th0x0472@localhost ~]$ PS1="[\u@\h \w(\$(echo \$?))]\$ "
[th0x0472@localhost ~(0)]$ /bin/false
[th0x0472@localhost ~(1)]$ /bin/true
[th0x0472@localhost ~(0)]$


思いっきり、けものフレンズに便乗しましたが、キッカケは1月の #ssmjp@usaturn 先生デモのときのBlacknon(エビス)さんのツイートです。






テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
コマンドが正常終了したらプロンプトに「たのしー」か「うれしー」か「すごーい」をしゅつりょくする th0x0472.log/BIGLOBEウェブリブログ
文字サイズ:       閉じる