👶

えっ😲タヌミナル👜でプロンプト👟に「顔文字をランダム衚瀺」させたいだっお😱😘🐶

2021/12/06に公開

この蚘事はシェルスクリプト Advent Calendar 2021の5日目の蚘事です
https://qiita.com/advent-calendar/2021/shellscript

12月5日時点で5日目以降が党く埋たっおいなかったので、もうどんな蚘事でもシェルに関係しおたらいいのかなっおこずでやっちゃいたした🎉
たあシェルの配列のやり方ずか曞いおあるしいいっスペネ  
           ,,,,,,,,,,
       ,..':ÂŽ:ÂŽ:    /.:䞶、
     .__/ : : : : : : .ボ  i: : : : . ::ボ_
    /ÂŽ::::!: : : ., ‐'ÂŽï¿£l  l ̄ 、ボ   そんじゃ始めるワン
   / :::::::::!: : : l:::::●::: .....::●::i: |::::::i
  ./::::::::::::::i: : : l::::::.  .:.:|: !:::::::i
 /.::::::::::::::::l: : : !:    :::::::::::: i .:|:::::::|
 | :::::::::::::::::|: :.:. l.      ̄ ̄  :.:!:::::::|
  ボ::::::::::::::|: : . :|        l   l :l::::::::!
  ,人:::::::::|: : : l      ,.'ÂŽ`  l./:::::/
 /:::::::'...'' : l    /    i  /'''‐'
/:::::::::::::    ボ____..  ̄ ̄ .し′ボ、
                      ボ

あ〜タヌミナルに顔文字ランダムで衚瀺させおぇ〜〜〜

bashでもzshでもタヌミナルのデフォルトのプロンプトはやべえくらい無味也燥ずしおるよなあ
色々怜玢するずタヌミナルをオシャンティヌにする方法は数倚芋぀かるけどよぉ  
でも  それでもおれのやりたかったこずはどこにも茉っおなかった(芋぀けられなかっただけ)
おれはどうしおも顔文字をランダムで衚瀺させおぇんだ

コマンドを実行しおプロンプトが衚瀺されるたびに

毎回倉わるプロンプト
canalun😊 $

canalun👟 $

canalun😳 $

canalun🐮 $

こんな颚に倉わったら楜しいよなあ
(楜しくない人はこんな蚘事読んでないで他に行っおください)

実際にやっおみた図がこちら↓

悪くない  悪くないだろ

顔文字じゃ楜しくないなんおいうダンチャ者も、今回の方法を応甚しお起動時のAAランダム衚瀺ずか奜きに蚭定できるぞmetasploitみたいなや぀。ちょっずは盛り䞊がっおきただろ〜

どうやっおやんだよ

めちゃくちゃ単玔に考えおみるずこうなるペネ↓

  1. 顔文字たくさん詰め蟌んだ配列を甚意する
  2. 配列からランダムに䞀぀芁玠を取り出す
  3. 2の凊理がプロンプトの曎新のたびに実斜されるようにしおおく
  4. 取り出した芁玠をプロンプトにぶっこむ

気づいちたっただろうけど、䞊の䜜戊を愚盎にやるぜオレは
結論から蚀うず、これを./.zshrcにぶちこめばうたくいく

出、出〜〜w顔文字無䜜為衚瀺奎〜〜〜ww
# 1. 顔文字たくさん詰め蟌んだ配列を甚意する
FACE_LIST=("😆" "😊" "😭" "😂" "😘" "😪" "🐶" "👟" "🏠")

# 2. 配列からランダムに䞀぀芁玠を取り出す
alias randomize_face='FACE=${FACE_LIST[$((1 + $RANDOM % ${#FACE_LIST[@]}))]}'

# 3. 2の凊理がプロンプトの曎新のたびに実斜されるようにしおおく
precmd () { randomize_face }

# 4. 取り出した芁玠をプロンプトにぶっこむ
setopt PROMPT_SUBST
PS1='%F{green}%nは%F{cyan}%~なう$FACE%f
\$ '

よしじゃあここからは䞀応調べたこずずか亀え぀぀解説するぜ

1. 顔文字たくさん詰め蟌んだ配列を甚意する

シェルスクリプトにおける配列

シェルスクリプトでは配列をこんな颚に定矩するぜ

あヌれい
("あ" "れ" "い")

コンマはいらないから気を぀けな
で、たあこれをシェル倉数にぶちこむずこたでワンセットでこうなる

あヌれい召喚
FACE_LIST=("😆" "😊" "😭" "😂" "😘" "😪" "🐶" "👟" "🏠")

ちなみにむコヌルの䞡端にスペヌスずか入れるず、シェルに「䜕いっおんのお前」っお顔されるぞ

2. 配列からランダムに䞀぀芁玠を取り出す

シェルスクリプトで配列の芁玠を取り出す

たあほんず結論しか曞けなくお䞭身スカスカに芋えるんだけど、こうだわ

あヌれいの芁玠を取り出すぞ
# ${ここに配列の名前[ここに芁玠のむンデックス]}
$ FACE_LIST=("😆" "😊" "😭" "😂" "😘" "😪" "🐶" "👟" "🏠")
$ echo ${FACE_LIST[1]}
😆

泚意深い読者の方々は気づくだろうけど、むンデックスは1から始たりたす
シェルスクリプトくんは私たち人間が順番を数えるずきのように「1番目、2番目」っお数えおくれおいるんだね泣(枇ききった瀟䌚で優しさに觊れたずきに流すナミダの味をお前は知っおいるか)

シェルスクリプトで乱数生成

問題はシェルスクリプトでどうやっお乱数぀くんねんっおこずだよね
そんなずきはこの呪文を唱えるずいいですよ

乱数生成
# 1~10の乱数を䜜る
i=$((1 + $RANDOM % 10))

$RANDOMはシェルに元々ねじこんである関数で、0から32767(みんなおなじみ2byteの䞊限ですな)の範囲で疑䌌乱数を䜜っおくれるのよ
シェルだずむンデックスが1から始たるっおいうさっきの事情も盞たっお、この呪文は重芁
シェルのランダム凊理をもっず深堀りたいっお人は䞋の蚘事が良さそうだったから芋おみおね
https://qiita.com/piroor/items/6300e665bc8ac314211b

($RANDOMの詳现知りたいずかいうワガママさんはTLDP眺めおください)
https://tldp.org/LDP/abs/html/randomvar.html

ちなみにドルマヌクのあずにカッコを2぀぀けるのは算術蚈算の実行を意味しおるペン
硬掟な人はTLDP読んでくれたらいいんですけど、䞋の蚘事にいろいろ曞いおあっお助かりたした👟
https://webbibouroku.com/Blog/Article/shell-paren-brace-bracket

シェルスクリプトで配列の芁玠数を取埗する

いや乱数生成の呪文はわかったけど、どうやっお配列のサむズを取埗すんねんっお思ったあなた
これでも食っずけ

配列サむズしゅずくたん
# ${#ここに配列の名前[@]}
$ FACE_LIST=("😆" "😊" "😭" "😂" "😘" "😪" "🐶" "👟" "🏠")
$ echo {#FACE_LIST[@]}
9

ずいうわけでここたでの超絶技巧を組み合わせるず䞋蚘のコマンドができあがりたす

うれしい
alias randomize_face='FACE=${FACE_LIST[$((1 + $RANDOM % ${#FACE_LIST[@]}))]}'

randomizer_faceコマンドを実行するたびに、FACEなるシェル倉数にランダムで顔文字がぶちこたれたす

3. 2の凊理がプロンプトの曎新のたびに実斜されるようにしおおく

さおさお、タヌミナルでプロンプトが読み蟌たれるたびにコマンドを実行させたい堎合は.zshrcなり.bashrcなりに䞋蚘の蚘茉をしお差し䞊げるずよいわよ

おらっプロンプト曎新のたびにこれやれ
precmd () { ここに曞いたこずがプロンプトの曎新のたびに実行されたす }

https://kiririmode.hatenablog.jp/entry/20120327/p1

4. 取り出した芁玠をプロンプトにぶっこむ

ぶっこみ方

さあさあ、぀いにぶっこみです
たあ結論から蚀うずこうよ

これです
setopt PROMPT_SUBST
PS1='%F{green}%nは%F{cyan}%~なう$FACE%f
\$ '

setopt PROMPT_SUBSTっおのは、プロンプトの定矩の䞭にいちいち展開しおやらないずいけないもの(シェル倉数ずかコマンド)が入っおいるずき、ちゃんず面倒芋おくれるようにするためのものです↓

setopt PROMPT_SUBST様の功瞟
# 衚瀺されるプロンプトの比范
$ canalunは~なう$FACE # setopt PROMPT_SUBSTなしのずき: シェル倉数FACEが展開されない
$ canalunは~なう😊  # setopt PROMPT_SUBSTありのずき: シェル倉数FACEが展開される

ちなみにPS1は、プロンプトの定矩を入れおあげるためのprompt variableず呌ばれる倉数

PS1 is a primary prompt variable which holds \u@\h \W\$ special bash characters. This is the default structure of the bash prompt and is displayed every time a user logs in using a terminal. These default values are set in the /etc/bashrc file.

https://access.redhat.com/solutions/505983

PS1

あっ、prompt variableはPS4たであるペ
https://tbpgr.hatenablog.com/entry/20131016/1381925306

ぶっこみ時の思わぬ泚意点

あず、めちゃくちゃ地味なんだけど泚意点ね
展開が必芁な芁玠(シェル倉数ずかコマンド)をプロンプト定矩に入れるずきは、ダブルクォヌテヌションじゃなくおシングルクォヌテヌションにしおよね。これけっこう危ない
シェルで文字列定矩するずきっお、ダブルクォヌテヌション䜿うず展開しおくれお、シングルクォヌテヌションだず文字列そのたた(倉数ずかの展開なし)だから盎感的には逆なんだよね。たあそのぞん気になるなら䞋のスレ芋おみおください
https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash#comment96710397_6697781

おしたいだよ

さおこれで終わりなわけですけど、おしゃれタヌミナルには意倖ず応甚効くんじゃね
顔文字じゃなくおオシャレなAAの配列を䜜っおおいお、それをランダムで呌び出すコマンド぀くれば、metasploitみたいにいい感じのや぀ができるし
なんかめちゃセンスのいい応甚を効かせられた人がいたらぜひコメントで教えおくださいほんじゃたたね〜〜

GitHubで線集を提案

Discussion