大石泉のジト目は万病に効く

今はまだ効かないがそのうち効くようになる

オタクはシェル芸をやれ

この記事は、統治行為論 Advent Calendar 2022の23日めの記事です。ユリウス暦ではまだ13日だか14日だからセーフ。

この記事は

統治行為論さんがシェル芸をやるとたぶん面白いので、オタクにシェル芸を布教します。

前提知識

  • シェル芸の存在

別に今初めて存在を知った人でも普通に読めます。「シェル芸?あー知ってる知ってる、あれでしょ?」くらいで進みましょう。あとは正規表現を知ってるともっとgood。

シェル芸をやろう

シェル芸をざっくり解説すると、「shellっていう環境でカタカタやってファイルを動かしたり文字列を変えたり画像を作ったりする技術」です。

ツイのオタクはシェル芸botの出力結果という形で見ることが多いと思います。

シェル芸人に増えてほしい

私がこういうのをもっと見たいためです。というわけで、シェル芸をTwitterで遊ぶためのやり方とシェルの書き方を書きます。

やり方

  1. シェル芸botをフォローして、フォロバを待つ
  2. #シェル芸 をつけて、シェルスクリプトを書いてツイート

以上です。

シェルスクリプトの書き方

私がよく使うやつを、実例から説明します。 まずはこの例から。

echo

echoは後に続く文字列を結果として返します。

|

| (パイプ)は、前の実行結果を引数に受け取って後ろに渡してくれます。

なので、

echo う ー ー ー ー う ま だっち う ー ー ー う ま ぴょ い う ま ぴょ い う ー ー すき だっち う ー ー う まぽ い う ま う ま う みゃ う みゃ 3 2 1 Fight|sed 's/\s/->/g'

の部分では、文字列う ー ー ー ー う ま だっち う ー ー ー う ま ぴょ い う ま ぴょ い う ー ー すき だっち う ー ー う まぽ い う ま う ま う みゃ う みゃ 3 2 1 Fightechoにより出力され、|によってsed 's/\s/->/g'にその結果が渡されています。

sed

sedは、前から|でもらったものに後ろのコマンドを適用して、適用後の結果を返します。

なので、echo う ー ー ー ー う ま だっち う ー ー ー う ま ぴょ い う ま ぴょ い う ー ー すき だっち う ー ー う まぽ い う ま う ま う みゃ う みゃ 3 2 1 Fight|sed 's/\s/->/g'|xargs -I@ echo "digraph{@}"

の部分では、echoで出た文字列に、's/\s/->/g'がコマンドとして適用され、その結果が後ろのxargs -I@ echo "digraph{@}"に渡されています。要は流れ作業の各ステップでどういう処理をするかってことです。

次にこの's/\s/->/g'の役割を説明します。

s/

s/変更前/変更後/オプションで、変更後に一致するものが変更後に置き換えられます。例えば's/\s/->/g'は、\s(空白文字、つまりスペース)を->に置き換えるという意味です。そして最後のgはgeneralかなんかの略で、全部の\s->になります。

つまり、echo う ー ー ー ー う ま だっち う ー ー ー う ま ぴょ い う ま ぴょ い う ー ー すき だっち う ー ー う まぽ い う ま う ま う みゃ う みゃ 3 2 1 Fight|sed 's/\s/->/g'

の結果は全部のスペースが->になって

う->ー->ー->ー->ー->う->ま->だっち->う->ー->ー->ー->う->ま->ぴょ->い->う->ま->ぴょ->い->う->ー->ー->すき->だっち->う->ー->ー->う->まぽ->い->う->ま->う->ま->う->みゃ->う->みゃ->3->2->1->Fight

となります。

ここの処理で正規表現がいろいろ使えるので、やってみてください。

xargs

xargsも、前から|でもらったものに後ろのコマンドを適用して、適用後の結果を返します。sedと違って正規表現以外が使えるというメリットがあり、もらったものにいい感じの名前(1文字だけだけど)を付けて使えます。

というわけで、echo う ー ー ー ー う ま だっち う ー ー ー う ま ぴょ い う ま ぴょ い う ー ー すき だっち う ー ー う まぽ い う ま う ま う みゃ う みゃ 3 2 1 Fight|sed 's/\s/->/g'|xargs -I@ echo "digraph{@}"では、

文字列う->ー->ー->ー->ー->う->ま->だっち->う->ー->ー->ー->う->ま->ぴょ->い->う->ま->ぴょ->い->う->ー->ー->すき->だっち->う->ー->ー->う->まぽ->い->う->ま->う->ま->う->みゃ->う->みゃ->3->2->1->Fight

xargs -I@ echo "digraph{@}"に渡されています。



もらった文字列に-I@@という名前を付け、echo "digraph{@}"を実行します。

@は変数として展開されてう->ー->ー->ー->ー->う->ま->だっち->う->ー->ー->ー->う->ま->ぴょ->い->う->ま->ぴょ->い->う->ー->ー->すき->だっち->う->ー->ー->う->まぽ->い->う->ま->う->ま->う->みゃ->う->みゃ->3->2->1->Fightになり、最終的には

echo "digraph{う->ー->ー->ー->ー->う->ま->だっち->う->ー->ー->ー->う->ま->ぴょ->い->う->ま->ぴょ->い->う->ー->ー->すき->だっち->う->ー->ー->う->まぽ->い->う->ま->う->ま->う->みゃ->う->みゃ->3->2->1->Fight}"

が実行されます。

実行結果はもちろん digraph{う->ー->ー->ー->ー->う->ま->だっち->う->ー->ー->ー->う->ま->ぴょ->い->う->ま->ぴょ->い->う->ー->ー->すき->だっち->う->ー->ー->う->まぽ->い->う->ま->う->ま->う->みゃ->う->みゃ->3->2->1->Fight}

dot

いよいよ最後のコマンドです。渡された文字列を解釈して画像に出力してくれます。

dot -Tpng>/images/0.pngは、png形式で、/images/0.pngに書き込みます。

まとめ

digraphの挙動を書き忘れました。まぁ->でノードと矢印が書けるのは見てたら何となくわかってもらえる気がするので頑張ってください。

ちなみにsed 's/\s/->/g'|xargs -I@ echo "digraph{@}は、もっと短くsed 's/\s/->/g;s/.*/digraph{&}'で書けます。

あと、Macユーザーの人や、WinユーザーでWSLをインストールしている人などは、手元である程度シェルで遊べます。

その他「ここどうなっとんねん」があれば私にDMやリプなどで質問してくださると、私のその時の人間性に応じて返答が返ってきます。DMの方が気づきやすいです。

ところで

街をつつむ Touchikoui Ron 孤独な t0uch1ko 動き出せば それは 紛れもなく ヤツさ (統治行為論 Advent Calendar 2022

皆さんはスペースコブラをご存じですか?

ニコマス界隈やジャガーマン界隈でさんざんネタに使われたアニメですが、実のところものすごい名作なんですよね。

スペースコブラは今1-5話16-19話が公式から公開されているので、見てください!見ろ、今すぐ。

https://media.discordapp.net/attachments/1054620871404302376/1056848101773680651/image.png 一番好きなカット