行き先なし

テキストエディタ争いを終わらせるために(ネタ)

ただのジョーク記事です

BashShellScript

※ この内容は Bash 5.1.16 で確認しています。

世界には vim, emacs, nano だけ存在するとします。
利用割合は均等に1/3とします。
なぜか vi コマンドでエディタが開きます。

どれか一つに決めると不満が出ます。

そういうときは .bashrc などシェルの初期化ファイルにこれを置きましょう。

alias vi='eval "$(printf "'"vim nano emacs"'" | cut -d "'" "'" -f $((($RANDOM+$RANDOM+$RANDOM)%3+1)))"'

vi が驚きを与えてくれるミラクルコマンドに変わりました。

めでたしめでたし

なぜ書いた

シェルスクリプトを書くときによく調べることが多いものが詰まっていたので書きました

メモ

eval

文字列を評価して実行する
これは他言語でもよくあるので忘れにくい

算術式展開

$((式)) で計算ができる。
小数など扱いたければ bc コマンドを使うのがよい

$RANDOM

$RANDOM0-32767 (2^15-1) の乱数を生成
算術式展開で済ませるために3で割れる数になるまで3回足した

cut

シェルでログの文字列なんかを処理したいときによく出るやつ。
指定した区切り文字で分割して中身を取り出す。

3つのうち一つを選ぶ操作なので配列を使うのが素直だがシェルの場合あらかじめ定義が必要なので1行だけで完結するように cutvim nano emacs を流し込んで取り出している。

配列例

$ arr=("vim" "nano" "emacs")
$ echo ${arr[$((($RANDOM+$RANDOM+$RANDOM)/3))]}

printf

名前からフォーマット指定文字列出力である
ここでは echo は改行が入るが printf は入らないことを目的に使っている

クォート

"文字列" または '文字列' のこと
例えば I'm をクォートするなら重ならない"を使って "I'm"、またはエスケープして 'I\'m''I''m' のように書く。

シェルスクリプトは毛色が違ってクォート無しが文字列の扱いになれます

$ echo abc
abc
$ echo "abc"ABC
abcABC

$ VAR=color

$ echo $VAR
color

$ echo "$VAR"
> color

echo $VARaa
>             # VARaa変数なので空

"$VAR"aa
> coloraa     # 区切りにもなる  "$VAR" / aa

echo ${VAR}aa  # 変数展開
> coloraa

コマンドの正体

alias先の文は5つに分解できます。

'eval "$(printf "'
"vim nano emacs"
'" | cut -d "'
" "
'" -f $((($RANDOM+$RANDOM+$RANDOM)%3+1)))"'

よく使う言語のエスケープとして読もうとするとややこしいですが、エスケープを考えずにクォート文字から次のクォート文字までで一区切りと捉えられます。

やっていることは vi を実行しようとすると vim/nano/emacs からランダムに選んで実行するものでした。