この記事は、統治行為論 Advent Calendar 2022の23日めの記事です。ユリウス暦ではまだ13日だか14日だからセーフ。
この記事は
統治行為論さんがシェル芸をやるとたぶん面白いので、オタクにシェル芸を布教します。
前提知識
- シェル芸の存在
別に今初めて存在を知った人でも普通に読めます。「シェル芸?あー知ってる知ってる、あれでしょ?」くらいで進みましょう。あとは正規表現を知ってるともっとgood。
シェル芸をやろう
シェル芸をざっくり解説すると、「shellっていう環境でカタカタやってファイルを動かしたり文字列を変えたり画像を作ったりする技術」です。
ツイのオタクはシェル芸botの出力結果という形で見ることが多いと思います。
https://t.co/vBAKGBTSQ4 pic.twitter.com/i0WtELxkwc
— シェル芸bot (@minyoruminyon) 2022年4月22日
https://t.co/KeBGL6LPYK pic.twitter.com/WkDSJanGt5
— シェル芸bot (@minyoruminyon) 2020年11月25日
バキバキチンチン https://t.co/ZW0LTaLHpq
— シェル芸bot (@minyoruminyon) August 27, 2022
シェル芸人に増えてほしい
私がこういうのをもっと見たいためです。というわけで、シェル芸をTwitterで遊ぶためのやり方とシェルの書き方を書きます。
やり方
以上です。
シェルスクリプトの書き方
私がよく使うやつを、実例から説明します。 まずはこの例から。
https://t.co/vBAKGBTSQ4 pic.twitter.com/i0WtELxkwc
— シェル芸bot (@minyoruminyon) 2022年4月22日
echo
echo
は後に続く文字列を結果として返します。
|
|
(パイプ)は、前の実行結果を引数に受け取って後ろに渡してくれます。
なので、
echo う ー ー ー ー う ま だっち う ー ー ー う ま ぴょ い う ま ぴょ い う ー ー すき だっち う ー ー う まぽ い う ま う ま う みゃ う みゃ 3 2 1 Fight|sed 's/\s/->/g'
の部分では、文字列う ー ー ー ー う ま だっち う ー ー ー う ま ぴょ い う ま ぴょ い う ー ー すき だっち う ー ー う まぽ い う ま う ま う みゃ う みゃ 3 2 1 Fight
がecho
により出力され、|
によって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)
皆さんはスペースコブラをご存じですか?
ニコマス界隈やジャガーマン界隈でさんざんネタに使われたアニメですが、実のところものすごい名作なんですよね。