Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2912

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

$
0
0

概要

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

スクリーンショット 2020-02-15 14.22.34.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

エラー。。。
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
上手くいくようになった。

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コマンド集】


Viewing all articles
Browse latest Browse all 2912

Trending Articles