This post is aimed at kids, like the 6th graders who I was recently teaching about programming in Python. It is more about having fun than about learning, but I hope that if you enjoy playing around at the UNIX terminal, you’ll eventually learn to use this kind of system for real. Keep in mind this immortal scene from Jurassic Park.
To run the commands in this post, you’ll need a UNIX machine: either Linux or Mac OS X will work. You’ll also need the ability to install software. There are two options:
- Install precompiled binaries using a package manager, I’ll give command lines for Homebrew on OS X and for Apt on Ubuntu Linux. You’ll need administrator access to run Apt or to install Homebrew, but you do not need administrator access to install packages after Homebrew has been installed. Other versions of Linux have their own package managers and they are all pretty easy to use.
- Build a program from source and install it in your home directory. This does not require administrator access but it’s more work and I’m not going to go into the details, though I hope to do this in a later post.
ROT13 using tr
The tr utility should be installed by default on an OS X or Ubuntu machine. It translates the characters in a string into different characters according to rules that you provide. To learn more about tr (or any other command in this post) type this command (without typing the dollar sign):
$ man tr
This will show you the UNIX system’s built-in documentation for the command.
In this and subsequent examples, I’ll show text that you should type on a line starting with a dollar sign, which is the default UNIX prompt. Text printed by the system will be on lines not starting with a dollar sign.
We’re going to use tr to encrypt some text as ROT13, which simply moves each letter forward in the alphabet by 13 places, wrapping around from Z to A if necessary. Since there are 26 letters, encrypting twice using ROT13 gives back the original text. ROT13 is fun but you would not want to use it for actual secret information since it is trivial to decrypt. It is commonly used to make it hard for people to accidentally read spoilers when discussing things like movie plot twists.
Type this:
$ echo 'Hello this is a test' | tr 'A-Za-z' 'N-ZA-Mn-za-m' Uryyb guvf vf n grfg
Now to decrypt:
$ echo 'Uryyb guvf vf n grfg' | tr 'A-Za-z' 'N-ZA-Mn-za-m' Hello this is a test
Just two more things before moving on to the next command.
First, the UNIX pipe operator (the “|” character in the commands above, which looks a little bit like a piece of pipe) is plumbing for UNIX commands: it “pipes” the output of one command to the input of a second command. We’ll be using it quite a bit.
Second, how exactly did we tell tr to implement ROT13? Well, the first argument, ‘A-Za-z’, gives it a set of characters to work with. Here A-Z stands for A through Z and a-z stands for a through z (computers treat the capital and lowercase versions of letters as being separate characters). So we are telling tr that it is going to translate any letter of the alphabet and leave any other character (spaces, punctuation, numbers, etc.) alone. The second argument to tr, ‘N-ZA-Mn-za-m’, specifies a mapping for the characters in the first argument. So the first character in the first argument (A) will be translated to the first character of the second argument (N), and so on. We could just as easily use tr to put some text in all uppercase or all lowercase, you might try this as an exercise.
fortune
Tragically, this command isn’t installed by default on a Mac or on an Ubuntu Linux machine. On a Mac you can install it like this:
brew install fortune
If this doesn’t work then you need to get Homebrew setup, try this page.
On Ubuntu try this:
sudo apt-get install fortune
The “sudo” command will ask you to enter your password before running the next command, apt-get, with elevated privileges, in order to install the fortune program in a system directory that you are normally not allowed to modify. This will only work if your machine has been specifically configured to allow you to run programs with elevated privileges.
In any case, if you can’t get fortune installed, don’t worry about it, just proceed to the next command.
Fortune randomly chooses from a large collection of mildly humorous quotes:
$ fortune I have never let my schooling interfere with my education. -- Mark Twain
say
This command is installed by default on a Mac; on Ubuntu you’ll need to type “sudo apt install gnustep-gui-runtime”.
Type this:
$ say "you just might be a genius"
Make sure you have sound turned up.
The Linux say command, for whatever reason, requires its input to be a command line argument, so we cannot use a pipe to send fortune’s output to say. So this command will not work on Linux (though it does work on OS X):
$ fortune | say
However, there’s another trick we can use: we can turn the output of one command into the command-line arguments for another command by putting the first command in parentheses and prefixing this with a dollar sign. So this will cause your computer to read a fortune aloud:
$ say $(fortune)
Another way to accomplish the same thing is to put fortune’s output into a file and then ask say to read the file aloud:
$ fortune > my_fortune.txt $ say -f my_fortune.txt
Here the greater-than symbol “redirects” the output of fortune into a file. Redirection works like piping but the output goes to a file instead of into another program. It is super useful.
If you run “say” on both a Linux box and a Mac you will notice that the Mac’s speech synthesis routines are better.
cowsay
The extremely important cowsay command uses ASCII art to show you a cow saying something. Use it like this:
$ fortune | cowsay __________________________________ / What is mind? No matter. What is \ | matter? Never mind. | | | \ -- Thomas Hewitt Key, 1799-1875 / ---------------------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
Both Homebrew and Apt have a package called “cowsay” that you can install using the same kind of command line you’ve already been using.
Cowsay has some exciting options, such as “-d” which makes the cow appear to be dead:
$ fortune | cowsay -d _________________________________________ / Laws are like sausages. It's better not \ | to see them being made. | | | \ -- Otto von Bismarck / ----------------------------------------- \ ^__^ \ (xx)\_______ (__)\ )\/\ U ||----w | || ||
Use “man cowsay” to learn more.
ponysay
Don’t install ponysay unless you feel that cowsay is too restrictive. Also, it isn’t available as a precompiled package. You can build it from source code by first installing the “git” package using apt-get or brew and then running the following commands:
$ git clone https://github.com/erkin/ponysay.git $ cd ponysay $ ./setup.py --freedom=partial --private install
This procedure puts ponysay into an odd location, but whatever. Here (assuming Linux, on a Mac you’ll need to pipe a different command’s output to ponysay) a cute pony tells us the prime factorization of a number:
figlet
Figlet (actually called FIGlet but that’s not what you type to run the command) prints text using large letters comprised of regular terminal characters. For example:
$ whoami | figlet _ _ __ ___ __ _ ___| |__ _ __ | '__/ _ \/ _` |/ _ \ '_ \| '__| | | | __/ (_| | __/ | | | | |_| \___|\__, |\___|_| |_|_| |___/
Figlet has lots of options for controlling the appearance of its output. For example, you can change the font:
$ echo 'hello Eddie' | figlet -f script _ _ _ ___ | | | | | | / (_) | | o | | _ | | | | __ \__ __| __| _ |/ \ |/ |/ |/ / \_ / / | / | | |/ | |_/|__/|__/|__/\__/ \___/\_/|_/\_/|_/|_/|__/
Another command, toilet, is similar to figlet but has even more options. Install both of these programs using the same kinds of commands we’ve already been using to talk to package managers.
lolcat
The UNIX “cat” program prints a file, or whatever is piped into it, to the terminal. Lolcat is similar but it prints the text in awesome colors:
bb
The bb program doesn’t seem to be available from Homebrew, but on Ubuntu you can install it using “sudo apt-get install bb”. It is a seriously impressive ASCII art demo.
rig
You know how lots of web sites want you to sign up using your name and address, but your parents hopefully have trained you not to reveal your identity online? Well, the rig utility can help, it creates a random identity:
$ rig Juana Waters 647 Hamlet St Austin, TX 78710 (512) xxx-xxxx
The zip codes and telephone area codes are even correct. For some reason rig will never generate an identity that lives in Utah.
bc
The bc program is a calculator but unlike almost every other calculator you use, it can handle numbers of unlimited size (or, more precisely, numbers limited only by the amount of RAM in your computer) without losing precision. Try this:
$ echo '2 ^ 100' | bc 1267650600228229401496703205376
Unfortunately bc does not have a built-in factorial function but you can write one easily enough using bc’s built-in programming language. Start bc in interactive mode (this will happen by default if you don’t pipe any text into bc) by just typing “bc”. Then enter this code:
define fact(n) { if (n < 2) return 1; return n * fact(n - 1); }
Now you can compute very large factorials:
fact(1000) 40238726007709377354370243392300398571937486421071463254379991042993\ 85123986290205920442084869694048004799886101971960586316668729948085\ 58901323829669944590997424504087073759918823627727188732519779505950\ 99527612087497546249704360141827809464649629105639388743788648733711\ 91810458257836478499770124766328898359557354325131853239584630755574\ 09114262417474349347553428646576611667797396668820291207379143853719\ 58824980812686783837455973174613608537953452422158659320192809087829\ 73084313928444032812315586110369768013573042161687476096758713483120\ 25478589320767169132448426236131412508780208000261683151027341827977\ 70478463586817016436502415369139828126481021309276124489635992870511\ 49649754199093422215668325720808213331861168115536158365469840467089\ 75602900950537616475847728421889679646244945160765353408198901385442\ 48798495995331910172335555660213945039973628075013783761530712776192\ 68490343526252000158885351473316117021039681759215109077880193931781\ 14194545257223865541461062892187960223838971476088506276862967146674\ 69756291123408243920816015378088989396451826324367161676217916890977\ 99119037540312746222899880051954444142820121873617459926429565817466\ 28302955570299024324153181617210465832036786906117260158783520751516\ 28422554026517048330422614397428693306169089796848259012545832716822\ 64580665267699586526822728070757813918581788896522081643483448259932\ 66043367660176999612831860788386150279465955131156552036093988180612\ 13855860030143569452722420634463179746059468257310379008402443243846\ 56572450144028218852524709351906209290231364932734975655139587205596\ 54228749774011413346962715422845862377387538230483865688976461927383\ 81490014076731044664025989949022222176590433990188601856652648506179\ 97023561938970178600408118897299183110211712298459016419210688843871\ 21855646124960798722908519296819372388642614839657382291123125024186\ 64935314397013742853192664987533721894069428143411852015801412334482\ 80150513996942901534830776445690990731524332782882698646027898643211\ 39083506217095002597389863554277196742822248757586765752344220207573\ 63056949882508796892816275384886339690995982628095612145099487170124\ 45164612603790293091208890869420285106401821543994571568059418727489\ 98094254742173582401063677404595741785160829230135358081840096996372\ 52423056085590370062427124341690900415369010593398383577793941097002\ 77534720000000000000000000000000000000000000000000000000000000000000\ 00000000000000000000000000000000000000000000000000000000000000000000\ 00000000000000000000000000000000000000000000000000000000000000000000\ 0000000000000000000000000000000000000000000000000000
While we're at it, you should figure out why the factorial of any large number contains a lot of trailing zeroes.
Conclusion
We've only scratched the surface, I'll share more entertaining UNIX commands in a followup post. Some of these programs I hadn't even heard of until recently, a bunch of people on Twitter gave me awesome suggestions that I've used to write this up. If you want to see a serious (but hilariously outdated) video about what you can do using the UNIX command line, check out this video in which one of the original creators of UNIX shows how to build a spell checker by piping together some simple commands.
29 responses to “Fun at the UNIX Terminal Part 1”
A some simpler unix stuff can be run here without needing anything but a browser: http://bellard.org/jslinux/
rev is fun
echo “hello” | rev
olleh
and on my Mac, banner is preinstalled
banner -w 40 “hello”
but maybe not as cool as your ASCII art text.
This really clever piece of code (from Luca Prigioniero, a student of mine) gives the number of leading zeros of n! without the need to compute the factorial:
int count = 0;
do {
n /= 5;
count += n;
} while ( n > 0 );
Cool, isn’t it?
It’s probably better to use the https address for GitHub, since that doesn’t require you to have an account.
linux_logo can be fun (I really should do something about the huge background of issues queued up on github).
Not even just for middle schoolers, I was mildly shocked how many undergrads had never logged on to a muti-user UNIX box before. At the end of my network engineering class I set up a raspberry pi with vintage tools (like unix talk, wall, finger, write, a talker (telnet-based BBS)) so they could play “hacker” with tcpdump. They all had a blast writing messages to each other’s screens.
It does make you feel old. I had the odd experience of trying to explain the concept of “alt.fan.warlord” to a recent bunch. It made a lot more sense to them when I told them Linus Torvalds had been a frequent poster.
Thanks for the extra tips, folks!
Roman, I have changed the link to https, I didn’t know about this distinction.
Vince, it’s great to get the students doing this stuff, they’ve had GUI crap in their faces for too long.
Very satisfying blog entry!
I love nested cowsay:
echo “Moo.” | cowsay -n | cowsay -n
Never seen ‘bb’ – but if you like colourful ascii demos you might like cacafire
Install caca-utils to get it.
Unset DISPLAY to ensure you set your terminal on fire, not the X display.
Nested cowsay is the best!!!
I love cacafire too!
You can run most all of these on Windows, too, using either Cygwin or, on Windows 10, Ubuntu on Windows using the Windows Subsystem for Linux.
Thanks David you’re right, I’ll update the post to mention this (but not tonight).
http://www.pixelbeat.org/docs/terminal_colours/ has some fun examples at the bottom
another site that you might find interesting for interacting with the commandline using a browser – https://cmdchallenge.com
For Ubuntu users, installing Ponysay is easy!
How to install:
Open up a terminal, and paste the following commands (ignore the $ sign):
“`
$ sudo add-apt-repository ppa:vincent-c/ponysay
$ sudo apt-get update
$ sudo apt-get install ponysay
“`
I always found `sl` hilarious when you mistype `ls` (although it mayor not be installed by default)
A couple of days ago I created “jazzup” a fun cli utility that adds a soundtrack and movie quotes to your long running boring commands. Check it out on npm : https://www.npmjs.com/package/jazzup
the “bsdgames” package is also a fun one to install on a Linux box. I’ve managed to distract large groups of people by starting up a game of “bog” (boggle).
There are also some fun ascii-art games you can play, but not as easy to install as some of the others. Such as “overkill”. Also some of my “Tom Bombem” games but those were written as IOCCC entries and/or 8kB assembly language challenges so they take a bit more effort to install.
This one is fun too:
curl wttr.in
>> While we’re at it, you should figure out why the factorial of any large number contains a lot of trailing zeroes.
Actually, you should go on and try to explain why there are a lot of trailing zeroes even when the result is expressed in in base 2, 3, 8, 16 or 93… Well much less trailing zeroes when the base is a prime number.
I like demonstrating the cal command (to get across the idea of command arguments); I tell students to use it to figure out which day of the week they were born on.
If a command doesn’t support stdin but supports opening a file, have you tried /dev/stdin? I’m looking at the fortune | say example.
Oh, adding to J. David Eisenberg, running “cal 1752” is pretty fun! (Guess this depends on what you consider fun.)
It might require a different year depending on your locale, I’m not sure. 1752 should work for most English speaking countries?
Here’s “cal 9 1752” on my computer:
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
telnet mtrek.com 1701
http://www.telnet.org/htm/places.htm
https://github.com/zachlatta/sshtron
sudo apt-get install moon-buggy fun little mini game
Sudo apt-get install pianobar Pandora in the terminal!
Have fun!
Since telnet is command line, I enjoyed watching the ascii version of StarWars with
telnet towel.blinkenlights.nl
Though haven’t tried it in years.
Because it took me quite a while to find the equivalent Fedora packages, here’s a command to install most of the recommended tools (then again, why would you make your child use Fedora, I don’t know…)
sudo dnf install fortune-mod espeak cowsay figlet rubygems
gem install lolcat
Note that:
– “espeak” is the closest equivalent to “say” available in Fedora;
– “rubygems” is required to install lolcat (hence the “gem install lolcat” command);
– I found no packages for bb and rig, which is unfortunate;
– all of this was tested on a Fedora 24.
What, no love for sl? Code can be found on github/mtoyoda/sl but any well-assorted package repository should already contain it.
Brendan Gregg has a series of very neat programs which can be found at brendangregg(dotcom)/specials
sl is on the list for part 2!
But since I got so many great suggestions there may also be a part 3.