Cowsay is a fun little app that draws a cow that says things, but you can do so much more than a cow, there's all sorts of fun ascii art critters in there; but how do we get to them? Lots of solutions simply find the directory where cowfiles (the templates that define the critters) are stored and hard-code that; but how do you know where they are? Turns out, cowsay will tell you if you pass the `-l` flag like so: $>cowsay -l which outputs the directory, and a list of all available cowfiles - much simpler than using `find`. But if there's a list of cowfiles there, why bother using `ls` to get the directory listing? simply trim off the first line by piping to `sed`, and ask it to delete it $>cowsay -l | sed "1 d" now we've got a nice clean list to randomize; You could use `shuf`, or bash's built-in array-mangling utilities; for sake of portability, this script uses both: #! /bin/bash if type shuf >/dev/null 2>&1; then cowfile="$(cowsay -l | sed "1 d" | tr ' ' '\n' | shuf -n 1)" else cowfiles=( $(cowsay -l | sed "1 d") ); cowfile=${cowfiles[$(($RANDOM % ${#cowfiles[*]}))]} fi cowsay -f "$cowfile" -W 79 "$@" store that as a script (i.e. [`cowsay.sh`][1]), put it in your path, and soon you will find randomized cow bliss. check it out $>fortune | cowsay.sh ____________________________________ / Is that really YOU that is reading \ \ this? / ------------------------------------ \ ^ /^ \ / \ // \ \ |\___/| / \// .\ \ /O O \__ / // | \ \ *----* / / \/_/ // | \ \ \ | @___@` \/_ // | \ \ \/\ \ 0/0/| \/_ // | \ \ \ \ 0/0/0/0/| \/// | \ \ | | 0/0/0/0/0/_|_ / ( // | \ _\ | / 0/0/0/0/0/0/`/,_ _ _/ ) ; -. | _ _\.-~ / / ,-} _ *-.|.-~-. .~ ~ \ \__/ `/\ / ~-. _ .-~ / \____(oo) *. } { / ( (--) .----~-.\ \-` .~ //__\\ \__ Ack! ///.----..< \ _ -~ // \\ ///-._ _ _ _ _ _ _{^ - - - - ~ P.S. that `$RANDOM` bit looks familiar, where have I seen that before? oh yeah - it's the only functional part in ["my" Oblique Strategies script][2]. [1]: https://github.com/JKirchartz/dotfiles/blob/master/scripts/cowsay.sh [2]: https://github.com/JKirchartz/dotfiles/blob/master/scripts/ObliqueStrategies