概要
pokemonsayをターミナルを開く際に実行させようと思ったら意外と大変だった。
OS: macOS Mojave
元ネタはこちら
https://qiita.com/kznovo/items/458cb010e1e8e76ea6c5
fortuneのインストールについては上記のサイトに載っているため省略させていただきます。
pokemonsayのインストール
以下のリンクに載っているため、こちらから行ってください。
https://github.com/possatti/pokemonsay
結論
結論から言うと
fortune | pokemonsay
これで良い気がした。
この下からは戦闘記録である。
やったこと
もともと使っていたcowsayのスクリプトの書き換え
挙げたリンクにあるcowsayのスクリプトを書き換えればいけるだろう思い、記事の最後にあるcowsayの部分をpokemonsayに変えてみた。
# vi
cowsay -f $(ls /usr/local/Cellar/cowsay/3.04/share/cows | grep .cow | gshuf -n 1) `fortune`
これを
# vi
pokemonsay -f $(ls /usr/local/Cellar/pokemonsay/v1.0.0/cows | grep .cow | gshuf -n 1) `fortune`
こうしてみた。
すると、
$ pokemonsay -f $(ls /usr/local/Cellar/pokemonsay/v1.0.0/cows | grep .cow | gshuf -n 1) hello
> cowsay: Could not find Exeggcute.cow cowfile!
> Exeggcute
このような感じで怒られる。
ファイル自体はあってもなぜか見つけられないらしい。
-f
で描画するのは難しそうだと思ったので、-p [ポケモン名]
になるようにスクリプトを変更することにした。
$ ls /usr/local/Cellar/pokemonsay/v1.0.0/cows | grep .cow
# 出力
Abra.cow
Aerodactyl.cow
Alakazam.cow
Arbok.cow
Arcanine.cow
Articuno.cow
...
このコマンドを打つとcowsディレクトリに入っている.cow
がついたファイルの一覧が表示される。
ポケモン名はこれらのファイル名に.cow
がついていないものに相当するため、.cow
より前の文字列を表示するように変更する。
$ ls /usr/local/Cellar/pokemonsay/v1.0.0/cows | grep .cow | cut -f 1 -d "."
# 出力
Abra
Aerodactyl
Alakazam
Arbok
Arcanine
Articuno
...
これで無事に消すことができた。
さっきのコマンドをこちらで修正して実行してみる。
| gshuf -n 1
という表示された一覧の中からランダムに一つ選ぶコマンドもつける。
$ pokemonsay -p $(ls /usr/local/Cellar/pokemonsay/v1.0.0/cows | grep .cow | cut -f 1 -d "." | gshuf -n 1 ) hello
これで無事に表示された。
fortuneとの接続
ここまでできたので、先ほどのコマンドのhello
部分をfortune
が動くように変更すれば良い。
$ pokemonsay -p $(ls /usr/local/Cellar/pokemonsay/v1.0.0/cows | grep .cow | cut -f 1 -d "." | gshuf -n 1 ) `fortune`
エラー。。。
Unknown option
はつけたつもりがないぞ、と思っていた。
原因
原因は簡単だった。fortuneを実行すると文が生成されるが、生成された文の中に-
や--
が含まれてしまうからだった。
例えばこんな感じのもの。
$ fortune
> Love is being stupid together.
-- Paul Valery
解決
シェルスクリプトの文字列置換などを試したものの、上手くいかないためpokemonsayのコードを書き換えることにした。
$ cd /usr/local/Cellar/pokemonsay/v1.0.0/
$ cat pokemonsay
/// 省略 ////
while [ $# -gt 0 ]
do
key="$1"
case $key in
-p|--pokemon)
POKEMON_NAME="$2"
shift; shift
;;
-p=*|--pokemon=*)
POKEMON_NAME="${1#*=}"
shift
;;
/// 省略 ////
-*)
echo
echo " Unknown option '$1'"
usage
;;
*)
# Append this word to the message.
if [ -n "$MESSAGE" ]; then
MESSAGE="$MESSAGE $1"
else
MESSAGE="$1"
fi
shift
;;
esac
done
/// 省略 ////
コマンドについて調べているコードはこちらであったため、こちらを書き換える。
$ vi pokemonsay
while [ $# -gt 0 ]
do
key="$1"
case $key in
/// 省略 ////
*)
# Append this word to the message.
while [ $# -gt 0 ]
do
if [ -n "$MESSAGE" ]; then
MESSAGE="$MESSAGE $1"
else
MESSAGE="$1"
fi
shift
done
;;
esac
done
保存する際に本当に保存してもいいのか?と聞かれるがのでyesと答える。
pokemonsay -p $(ls /usr/local/Cellar/pokemonsay/v1.0.0/cows | grep .cow | cut -f 1 -d "." | gshuf -n 1 ) `fortune`
を.bashrc(.zshrc)に書いておけばターミナル起動時に出てくるようになります。
参考
ターミナルを開くたびにキャラクターにランダムなことを言わせる[cowsay][fortune]
cutコマンドについてまとめました 【Linuxコマンド集】