pokemonsayにfortuneを噛ませたら意外と苦戦した話。

# 概要
pokemonsayをターミナルを開く際に実行させようと思ったら意外と大変だった。
OS: macOS Mojave

元ネタはこちら
https://qiita.com/kznovo/items/458cb010e1e8e76ea6c5

fortuneのインストールについては上記のサイトに載っているため省略させていただきます。

## pokemonsayのインストール
以下のリンクに載っているため、こちらから行ってください。
https://github.com/possatti/pokemonsay


# 結論
結論から言うと

``` .bashrc
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`
```

こうしてみた。<br><br>
すると、

```
$ 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
```
このような感じで怒られる。<br>
ファイル自体はあってもなぜか見つけられないらしい。<br>

`-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
...
```
これで無事に消すことができた。<br>
さっきのコマンドをこちらで修正して実行してみる。
` | gshuf -n 1`という表示された一覧の中からランダムに一つ選ぶコマンドもつける。

```
$ pokemonsay -p $(ls /usr/local/Cellar/pokemonsay/v1.0.0/cows | grep .cow | cut -f 1 -d "." | gshuf -n 1 ) hello
```
![スクリーンショット 2020-02-15 14.22.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514848/22d5a2f8-3e13-e6da-5ce3-3b376be8f367.png)


これで無事に表示された。

## fortuneとの接続
ここまでできたので、先ほどのコマンドの`hello`部分を`fortune`が動くように変更すれば良い。

```
$ pokemonsay -p $(ls /usr/local/Cellar/pokemonsay/v1.0.0/cows | grep .cow | cut -f 1 -d "." | gshuf -n 1 ) `fortune`
```

「なんだ、楽勝だなぁ〜」 と思ったところ、、、
![スクリーンショット 2020-02-14 23.43.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514848/17e2cd0a-8c64-c5f3-2379-07832bbd83e6.png)

エラー。。。
`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と答える。

これで実行すると、
![スクリーンショット 2020-02-15 15.33.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514848/9b0c9958-55f9-5cfe-0f11-df956da610d1.png)
上手くいくようになった。

```
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]](https://qiita.com/kznovo/items/458cb010e1e8e76ea6c5#4-%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%81%AA%E7%89%9B%E3%81%8C%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%81%AA%E3%81%93%E3%81%A8%E3%82%92%E8%A8%80%E3%81%86%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%8C%E8%B5%B0%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
[cutコマンドについてまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-cut)