LoginSignup
1
0

More than 3 years have passed since last update.

tmuxとbashだけで、ブラウザクラッシャー「you are an idiot」を再現する 続編

Posted at

tmuxを使ってターミナルを分割して増えるyou are an idiotを作りたい!

前回までのお話

前回の記事
前回実装した機能は以下の通り。

  • trapでCtrl - Cを押すたびに☺が増える。そのため、プロセスからkillする必要がある。
  • tputで白黒に点滅する。
  • soxを使って「You are an idiot♪」が流れる。

環境

  • Ubntu 20.04LTS
  • GNU bash, version 5.0.17(1)

参考にしたもの

tmuxを使う部分はhollywoodコマンドを参考にさせていただきました。

前回との比較

前回のもの

48bf39e0-8712-ca5b-10e4-476a563880ad.gif

tmuxを使った今回のもの

hoge2.gif
tmuxを使ってターミナルが分割されることで原作再現度が格段に上がっています。

ソースコードと少し解説

tmuxで新しい画面を作成すると、新しいシェルが立ち上がり関数等を指定して新規ウィンドウを立ち上げることができなかったので、☺を表示する部分を別のスクリプトに分割してパスを通しました。

youareidiot.bash
#!/bin/bash
#########################################################################
# Name: youareidiot.bash
#
# You are idiot animation
#
# Usage: ./youareidiot.bash
#
# Author: anon
# Date: 2021/03/09
##########################################################################
PKG="uareidiottmux" #必須(名前はなんでもいい)

function clonetmux() #tmuxのウィンドウを増やす
{
    for ((n=0; n < $cnt; n++));
    do
        [ "$h_or_v" = "-v" ] && h_or_v="-h" || h_or_v="-v"
        if [ $cnt -eq 1 ]; then
            ./uareidiotwithtmux.bash
        else
            panes=$(tmux list-panes -t $PKG 2>/dev/null)
            splits=$(echo "$panes" | wc -l)
            pane=$((RANDOM % $splits))
            tmux split-window $h_or_v -t "${PKG}.$pane" ./uareidiotwithtmux.bash
            sleep 0.5
        fi
    done
}


#--------------------main--------------------
declare -i cnt=${1:-1} #引数の数だけ画面を分割する。デフォルト値は1でCtrl-Cを押すたびに数が増えるように分割したスクリプトで設定してある。
echo $cnt > record #一時的にcntの値を保存しておくことで、異なるシェルにcntの値を渡す。

# tmux (だいたいコピペ)
arrangements="main-horizontal main-vertical tiled"
if [ -z "$TMUX" ]; then
    tmux_launcher=tmux
    $tmux_launcher new-session -d -s $PKG "/bin/bash"
    $tmux_launcher send-keys -t $PKG "$0 $1"
    $tmux_launcher send-keys -t $PKG Enter
    exec $tmux_launcher attach-session -t $PKG
    exit 1
fi

tmux new-window -n $PKG "$WIDGET_DIR/$widget1" \; \
    set-option -g pane-active-border-bg "default" \; \
    set-option -g pane-active-border-fg "default" >/dev/null 2>&1


clonetmux

分割したコードは前回のものとほとんど変わっていませんが、trapで起動するのを関数ではなく、youareidiot.bash(上のスクリプト)を指定しています。

youareidiotwithtmux.bash
#!/bin/bash
##########################################################################
# Name: uareidiotwithtmux.bash
#
# run automatically by youareidiot.bash
#
# Usage: ./youareidioto.bash
#
# Author: anon
# Date: 2021/03/09
##########################################################################
function changecolor() #色の点滅
{
    tput setab $1
    tput setaf $2
}


function runscript() #trap(Ctrl -C)を押した時に起動させる関数
{
    let cnt++
   ./youareidiot.bash $cnt
}

# main
declare -i cnt=$(cat record) #youareidiot.bash(上のスクリプトから分割数を受け取る。
trap runscript EXIT

declare -i i=0 t=7 tmp

while true #点滅させる関数に引数を交換しながら渡す。
do
    clear
    changecolor $i $t && echo -n " ☺  ☺  ☺ "
    echo -n -e "\n"
    if ps -e | grep play > /dev/null 2>&1; then
        :
    else
        play -q ./music/youareidiot.mp3 > /dev/null 2>&1 &
    fi
    sleep 1
    tmp=$i
    i=$t
    t=$tmp
done

おまけ

以下のコードをターミナルで実行すると作業が捗るようになります。(大嘘)

alias ls='youareidiot.bash'
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0