きっかけ
もっと色々やってみたい。 あれ?[Shell Script Advent Calendar 2015](http://qiita.com/advent-calendar/2015/shell-script)の22日目の枠残ってるじゃん。 じゃあやろう。 # 環境 Mac OSX Yosemite 10.10.5の端末上で実施。 zshを使って動作確認してますが、多分bashでも動きます。matsuya-generator-rubyが、cowsayコマンドと組み合わせるとシュールこの上ない。 pic.twitter.com/gxaudeU377
— ぐれさん (@grethlen) 2015, 12月 6
$ zsh --version
zsh 5.0.6 (x86_64-apple-darwin13.3.0)
使うコマンド達
生成系コマンド
無から何かを生成してくれる偉大なコマンド達
$ faker-cli
ランダムに色々(数字、人名、電話番号、e-mail、などなど本当に色々)生成してくれる。同様のコマンドにchancejs-cliがあるが今回はこちらを採用。
$ npm install -g faker-cli
# 人名を生成
$ faker-cli -n findName
"Kole Kuhlman"
# 日本人の苗字
$ faker-cli -L ja -n lastName
"田中"
# ありそうなメールアドレス
$ faker-cli -i email
"[email protected]"
$ matsuya-generator-ruby
松屋のメニュー名を動的自動生成
$ gem install matsuya
$ matsuya
オリジナルテキ定食
$ matsuya
旨辛ネギたま牛豆腐旨辛ネギたま牛焼肉定食
$ takarabako
ゲームにありそうなアイテム名・装備名をランダムに生成してくれる。
$ gem install takarabako
$ takarabako
賢者の首飾り
$ takarabako
星屑のつるぎ
$ yes-precure5-command
Yes!プリキュア5の変身バンクの口上を延々と出力できる。実行するごとにプリキュアがランダムに変わる。
$ cabal install yes-precure5-command
# 既存の``yes``コマンドを差し替えるPATH変更が必要。
$ export PATH=~/.cabal/bin/:$PATH
$ yes precure5
プリキュア!メタモルフォーゼ!
安らぎの緑の大地、キュアミント!
希望の力と未来の光!
華麗に羽ばたく5つの心!
Yes!プリキュア5!
プリキュア!メタモルフォーゼ!
(※以下無限に続く)
フィルタ系コマンド
入力を加工して出力。次のコマンドの入力にできる。これ自体が出力にもできる。
$ dajarep
Qiitaに作者の記事あり。ダジャレになってる行のみを抽出する。インストール方法はGithubを参照されたし。
$ cat test.txt
秋田は飽きた!
群馬は飽きた!
九州を吸収する。
群馬を吸収する。
$ cat test.txt | dajarep
秋田は飽きた!
九州を吸収する
# -dオプションをつけると、ダジャレの箇所の読みを教えてくれる。
$ cat test.txt | dajarep -d
秋田は飽きた![アキタ]
九州を吸収する[キュウシュウ]
$ MeCab
オープンソースの形態素解析ソフト。
$ brew install mecab mecab-ipadic
# 標準入力を分かち書きし、品詞や読みなどの情報を出してくれる。
$ echo "秋田は飽きた。" | mecab
秋田 名詞,固有名詞,地域,一般,*,*,秋田,アキタ,アキタ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
飽き 動詞,自立,*,*,一段,連用形,飽きる,アキ,アキ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS
$ gshuf
GNUのshuf
コマンド。標準入力を行単位でシャッフルする。この記事では重要な役割を担う。GNUのコマンドであるため、coreutils
をインストールすればMac上でgshuf
というコマンドで使える。
$ brew install coreutils
$ seq 10 | gshuf
3
8
4
7
2
6
5
1
9
10
その他一般的なコマンド
grep, sed, awk, cut, head, tail などなどビルドインのコマンドの力も借ります。
出力系コマンド
受け取った入力を加工して出力。ほぼ完成形にする。これ以上の加工は難しい。
$ cowsay
メッセージをつぶやくウシのアスキーアートを生成するプログラム。標準入力が吹き出しに入り、牛がしゃべる感じになる。オプションを変えると牛以外も色々できる。
$ brew install cowsay
$ echo 'Typical cowsay output!' | cowsay
________________________
< Typical cowsay output! >
------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
$ echo-sd
突然の死を起こす。引数の文字列を尖った吹き出しで囲んで表示する。吹き出し以外にも色々オプションが充実している。
$ wget -nv https://raw.githubusercontent.com/fumiyas/home-commands/master/echo-sd
$ sudo install -m 0755 echo-sd /usr/local/bin/echo-sd
$ rm echo-sd
$ echo-sd
_人人人人人人_
> 突然の死 <
 ̄Y^Y^Y^Y^Y^Y^ ̄
# -sオプションで標準入力を吹き出しで囲む
$ echo "こんにちは" | echo-sd -s
_人人人人人人人_
> こんにちは <
 ̄Y^Y^Y^Y^Y^Y^Y^ ̄
その他一般的なコマンド(Mac専用なので悪しからず)
$ open
何でも開く万能コマンド。ディレクトリを指定するとFinder、画像をopenすると画像ビューワーなど、拡張子に対応した閲覧ソフトを開いてくれる。また、htmlファイルを渡すとブラウザを開く。
# カレントディレクトリをFinderで開く
$ open .
# ファイルをブラウザで開く
$ open file.html
$ say
Macに標準で入っているコマンド。引数に文字列を与えると、その文字列を音声に変換してスピーカーから出力するコマンド。
# 流ちょうな声で"Hello World"という声をスピーカーから出す。
$ say "Hello World"
# -v Kyoko というオプションをつければ女性の声で日本語も発音できる。
$ say -v Kyoko "こんにちは"
やり方
生成系コマンド、フィルタ系コマンド、出力系コマンドを、パイプや複合コマンドをはじめとするコマンドの糊で適当にくっつけてシェル芸1をする。特に目的はない。
凄惨な結果達
死んだ目
$ matsuya | cowsay
__________________________
< プレミアム牛めし >
--------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
死んだ
$ cowsay ' '; matsuya | cowsay; echo-sd;
_
< >
-
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
__________________________
< プレミアム牛めし >
--------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
_人人人人人人_
> 突然の死 <
 ̄Y^Y^Y^Y^Y^Y^ ̄
共食いに耐えかねた
$ matsuya | cowsay -f bong
_________________
< 牛焼肉定食 >
-----------------
\
\
^__^
_______/(oo)
/\/( /(__)
| W----|| |~|
|| || |~| ~~
|~| ~
|_| o
|#|/
_+#+_
つるぎに見えない。そしてなぜグンマ。
$ takarabako | cowsay -f daemon
____________________
< 群馬のつるぎ >
--------------------
\ , ,
\ /( )`
\ \ \___ / |
/- _ `-/ '
(/\/ \ \ /\
/ / | ` \
O O ) / |
`-^--'`< '
(_.) _ ) /
`.___/` /
`-----' /
<----. __ / __ \
<----|====O)))==) \) /====
<----' `--' `.__,' \
| |
\ /
______( (_ / \______
,' ,-----' | \
`--{__________) \/
とりあえず松屋のメニューを形態素解析
$ matsuya | mecab
ネギ 名詞,一般,*,*,*,*,ネギ,ネギ,ネギ
たま 名詞,一般,*,*,*,*,たま,タマ,タマ
牛 名詞,一般,*,*,*,*,牛,ウシ,ウシ
めし 名詞,一般,*,*,*,*,めし,メシ,メシ
EOS
松屋のメニューとゲームのアイテムを混ぜる
$ (takarabako; matsuya) | mecab
破邪 名詞,一般,*,*,*,*,破邪,ハジャ,ハジャ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
剣 名詞,一般,*,*,*,*,剣,ケン,ケン
EOS
牛 名詞,一般,*,*,*,*,牛,ウシ,ウシ
焼肉 名詞,一般,*,*,*,*,焼肉,ヤキニク,ヤキニク
定食 名詞,一般,*,*,*,*,定食,テイショク,テイショク
EOS
名詞だけ抜き出してシャッフルする
$ (takarabako; matsuya) | mecab | grep 名詞 | gshuf
キムチ 名詞,一般,*,*,*,*,キムチ,キムチ,キムチ
プレミアム 名詞,一般,*,*,*,*,プレミアム,プレミアム,プレミアム
賢者 名詞,一般,*,*,*,*,賢者,ケンジャ,ケンジャ
めし 名詞,一般,*,*,*,*,めし,メシ,メシ
魂 名詞,一般,*,*,*,*,魂,タマシイ,タマシー
牛 名詞,一般,*,*,*,*,牛,ウシ,ウシ
中二病の松屋フーズ社員により提案された新メニュー
$ (takarabako; matsuya) | mecab -E '' | grep "名詞" | awk '$0=$1' | gshuf | tr -d '\n' ; echo
定食アルティメットヘルムハンバーグオリジナル
$ (takarabako; matsuya) | mecab -E '' | grep "名詞" | awk '$0=$1' | gshuf | tr -d '\n'; echo
ニンジャランスシャンピニオンシャンピニオンソースハンバーグカレー
$ (takarabako; matsuya) | mecab -E '' | grep "名詞" | awk '$0=$1' | gshuf | tr -d '\n'; echo
アイアンビビン丼シールド
$ (takarabako; matsuya) | mecab -E '' | grep "名詞" | awk '$0=$1' | gshuf | tr -d '\n'; echo
破邪鎮魂歌豚定食
ダジャレになっているメニューだけを抜き出す。ショウって微妙すぎだろ……
$ yes matsuya | head -n 30 | sh | dajarep -d
プレミアム旨辛豆腐キムチチゲカルビ焼膳(プレミアム牛肉使用)[ショウ]
豚バラ生姜焼定食[ショウ]
オリジナルカレギュウおろし生姜焼定食[ショウ]
生姜焼定食[ショウ]
豚バラ膳生姜焼定食[ショウ]
豆腐キムチチゲカルビ焼膳(プレミアム牛肉使用)[ショウ]
松屋の中二病 & ダジャレメニューキャンペーン
$ yes "(takarabako; matsuya) | mecab -E '' | grep '名詞' | awk '\$0=\$1' | gshuf | tr -d '\n'; echo" | head -n 30 | bash | dajarep -d
旨たま辛ネギめしプレミアム魂牛死神[タマ]
松屋にプリキュアコラボメニューができたようです
$ (yes precure5 | head -n 2 ; matsuya; matsuya) | mecab | grep 名詞 | awk '$0=$1' | gshuf | head -n 3 | tr -d '\n' ; echo
プリキュア丼定食
お客様、メニューは券売機でお買い求め下さい
$ matsuya | echo-sd -s
_人人人人人人_
> カルビ丼 <
 ̄Y^Y^Y^Y^Y^Y^ ̄
お客様、落ち着いて下さい
$ matsuya | mecab -O wakati | xargs -n 1 -I@ echo-sd "@"
_人人人人人人人人人_
> ブラウンソース <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
_人人人人人人人_
> ハンバーグ <
 ̄Y^Y^Y^Y^Y^Y^Y^ ̄
_人人人人_
> 定食 <
 ̄Y^Y^Y^Y^ ̄
イカれたメンバー紹介するぜ!
$ yes 'faker-cli -L ja -n lastName | xargs echo-sd -s' | head -n 5 | sh
_人人人人_
> 小林 <
 ̄Y^Y^Y^Y^ ̄
_人人人人人_
> 佐々木 <
 ̄Y^Y^Y^Y^Y^ ̄
_人人人人人_
> 佐々木 <
 ̄Y^Y^Y^Y^Y^ ̄
_人人人人_
> 山田 <
 ̄Y^Y^Y^Y^ ̄
_人人人人_
> 清水 <
 ̄Y^Y^Y^Y^ ̄
ダジャレメニューだけを注文する山田
$ echo $(faker-cli -L ja -n lastName | tr -d '"')"「$(yes matsuya | head -n 30 | sh | dajarep | head -n 1)」"
山田「たっぷりネギたっぷりネギ生姜焼定食」
echo-sdはこんなこともできるんです
$ echo-sd --stress
仕事のストレス
↘
仕事のストレス
↙
仕事のストレス
↘
仕事のストレス
↙
_人人人人人人人人人_
> 仕事のストレス <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
当然こういう発想になる
$ yes precure5 | head -n 5 | xargs echo-sd --stress
プリキュア!メタモルフォーゼ!
↘
大いなる希望の力、キュアドリーム!
↙
希望の力と未来の光!
↘
華麗に羽ばたく5つの心!
↙
_人人人人人人人人人人人_
> Yes!プリキュア5! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
日曜日の朝に仕事のことを考えるとこうなる
$ yes precure5 | head -n 4 | xargs echo-sd --stress
プリキュア!メタモルフォーゼ!
↘
はじけるレモンの香り、キュアレモネード!
↙
希望の力と未来の光!
↘
華麗に羽ばたく5つの心!
↙
_人人人人人人人人人_
> 仕事のストレス <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
武器を改造していくとまさかの結果が
$ (yes takarabako | head -n 4 | bash; matsuya) | xargs echo-sd --stress
パラディンシールド
↘
ニンジャブレイド
↙
アイスメイル
↘
ミスリルランス
↙
_人人人人人人人人人人人人人人人人_
> プレミアムおろしポン酢牛めし <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
Kyokoにアイテム名を発言させる。発音が良い。
Kyoko 「ブロンズネックレ↑ス↓」
$ takarabako | tee >(say -v Kyoko)
ブロンズネックレス
Kyokoに30人クラスの担任になってもらい、出席の点呼をしてもらう
$ yes 'faker-cli -L ja -n lastName | tee >(say -v Kyoko); sleep 1' | head -n 30 | bash | nl
1 "林"
2 "加藤"
3 "清水"
4 "伊藤"
5 "加藤"
6 "中村"
7 "渡辺"
8 "清水"
9 "中村"
10 "田中"
11 "井上"
...
※もっとリアルな学級にしたい人はrubyでgimeiを使うと良いです。
インストール:$ gem install gimei
使い方:$ ruby -r gimei -e 'puts Gimei.new'
$ yes "ruby -r gimei -e 'puts Gimei.new' | tee >(say -v Kyoko); sleep 1" | head -n 30 | bash | nl
1 窪田 真広
2 菊地 禅
3 大塚 邦彦
4 福原 憂樹
5 大木 靖子
6 西 孝広
7 長尾 将人
8 秋田 晴菜
9 今井 加野
10 梅田 好香
11 長谷川 史純
...
色々ごった煮にしてみた
$ {yes precure5 | head -n 5; yes 'matsuya; takarabako; faker-cli -L ja -n lastName' | head -n 5 | sh;} | gshuf | head -n 5 | xargs echo-sd --stress
カルビハンバーグ定食
↘
破邪の靴
↙
群馬の鎮魂歌
↘
井上
↙
_人人人人_
> 佐藤 <
 ̄Y^Y^Y^Y^ ̄
KyokoにYes!プリキュア5!の変身バンクを言わせる。
Kyoko「イエス・プリキュアゴ」
$ yes precure5 | head | sed -n '1,/^$/p' | tee >(say -v Kyoko)
プリキュア!メタモルフォーゼ!
安らぎの緑の大地、キュアミント!
希望の力と未来の光!
華麗に羽ばたく5つの心!
Yes!プリキュア5!
ランダムに都道府県名をカタカナで出力。
$ faker-cli -L ja --address state | mecab | grep 固有名詞 | cut -d',' -f 9
オーサカ
$ faker-cli -L ja --address state | mecab | grep 固有名詞 | cut -d',' -f 9
シズオカ
ご当地オリジナルプリキュアを作成。
$ yes precure5 | head -n 2 | tail -n 1 | sed "s/キュア.*/キュア$(faker-cli -L ja --address state | mecab | grep 固有名詞 | cut -d',' -f 9)/g"
はじけるレモンの香り、キュアトチギ
(そういえば栃木にレモン牛乳ってあったな……)
ご当地プリキュア全員変身バンク
$ for i in {2,2,2,2,5}; do yes precure5 | \
head -n "$i" | tail -n 1 | \
sed "s/キュア.*/キュア$(faker-cli -L ja --address state | \
mecab | grep 固有名詞 | cut -d',' -f 9)/g" ;done | \
xargs echo-sd --stress
情熱の赤い炎、キュアグンマ
↘
大いなる希望の力、キュアトチギ
↙
はじけるレモンの香り、キュアヤマグチ
↘
安らぎの緑の大地、キュアヤマナシ
↙
_人人人人人人人人人人人_
> Yes!プリキュアギフ <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
加藤君の黒歴史
$ yes precure5 | head -n 2 | tail -n 1 | sed "s/キュア.*/キュア$(faker-cli -L ja -n lastName | mecab | grep 固有名詞 | cut -d',' -f 9)/g"
知性の青き泉、キュアカトー
木村君なにがあった
$ yes precure5 | head -n 2 | tail -n 1 | \
sed "s/キュア.*/キュア$(faker-cli -L ja -n lastName | mecab | grep 固有名詞 | cut -d',' -f 9)/g" | \
cowsay -f beavis.zen
_________________________________________
/ 大いなる希望の力、キュアキ \
\ ムラ /
-----------------------------------------
\ __------~~-,
\ ,' ,
/ \
/ :
| '
| |
| |
| _-- |
_| =-. .-. ||
o|/o/ _. |
/ ~ \ |
(____@) ___~ |
|_===~~~.` |
_______.--~ |
\________ |
\ |
__/-___-- -__
/ _ \
猫好き必見。猫の画像を表示。
$ faker-cli -I cats |xargs -I@ open @
上記コマンドを実行すると、デフォルトで設定されているブラウザが開き、ランダムに取得された猫画像が表示されます。
中二病時代のクラスメイトの写真を表示する
$ F="/tmp/$$.html"; echo "<img src=%1 /><br /><h1>%2</h1>" | \
sed "s|%1|$(faker-cli -I avatar)|" | \
sed "s|%2|$(faker-cli -L ja -n lastName | xargs)「$(takarabako)」|" > $F && open $F
faker-cliでランダムに取得された人物アイコンの下にランダムなメッセージが出現します。
料理の写真と料理名のキャプションを勝手に表示
$ F="/tmp/$$.html"; echo "<img src=%1 /><br /><h1>%2</h1>" | \
sed "s|%1|$(faker-cli -I food)|" | \
sed "s|%2|$(matsuya)|" > $F && open $F
ビジネス写真+プリキュア+突然の死
$ F="/tmp/$$.html"; echo "<img src=%1 /><br /><h1>%2</h1>" | \
sed "s|%1|$(faker-cli -I business)|" | \
sed "s|%2|$(yes precure5 | head -n 5 | \
tail -n 1 | echo-sd -s | xargs | \
sed 's/ /<br>/g')|" > $F && open $F
まとめ
先日私はコマンドとコマンドをつなぐ糊という記事を書きましたが、そこにあったパイプやコマンド置換などを駆使すれば、上記のように少ないコマンドでも数珠つなぎにして色々なことができます。
とはいえ、書いてある記事を読んで、ストックするだけではなかなか身になりません。こういう遊びでも良いので(むしろ遊びのほうが良い気がする)実際に手を動かすことこそが、技術上達への近道の一つなんじゃないでしょうか(適当)。
-
マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。あるいはそのときのコマンド入力のこと。 https://blog.ueda.asia/?page_id=1434 ↩