• Tip Jar

CLI Day 2016

I didn’t have much time to do anything for CLI Day this year. But, I certainly didn’t want to neglect the holiday I created, so I threw something together at the last minute.
This year being a leap year, I thought it may be of interest to show how to find out which day CLI Day falls on. CLI, or the Roman Numeral 151, is also the day the holiday is on, so most years, it would be 5/31. However, this year is a leap year, so this time it is on 5/30. So, to see which day try this command:

\date +'%j' --date="5/31"

This year, that command yields the result 152, meaning of course that CLI Day would fall on 5/30. I know it’s not much, but I’ve been struggling with getting a CLI based screen reader for my new Odroid, and CLI Day sneaked up on me. I was hoping to have compile instructions for speakup on the Odroid for this year’s CLI Day, but that just didn’t happen.
Anyway, happy CLI Day, and I can’t wait to see what everyone else comes up with, it is pretty awesome how many people participate now in the holiday I started just for fun and to push myself to learn to use the console for everything.

Charm Works Again

This is just a quick post to test the GNU Social Comments plugin. I decided to try charm again to post this, and was pleasantly surprised to find it works again. Something in the last wordpress updates broke it, but now it’s back.
Just as a reminder, CLI Day 2015 is approaching quickly. GNU Social users can join the CLI Day Group. Don’t have a GNU Social account? Get one at social.2mb.solutions. Let’s make this year the biggest CLI Day ever!

Console Keyboard Shortcuts

People have been asking about keyboard shortcuts from the console. They do exist, and are very powerful. To create the shortcuts, you need to edit your ~/.inputrc file. These shortcuts are available in the terminal, not in applications. So, your shortcut won’t work inside Linphone for example. The following is a setup that will create keyboard shortcuts for the musicl player XMMS2, including a soft volume control, so your whole computer doesn’t drop or rise in volume with the music. Before using the volume controls you need to enter this in your terminal:

nyxmms2 server config effect.order.0 equalizer
nyxmms2 server config equalizer.enabled 1

You may notice that each of the following shortcuts end with \C-M. This is what appends a new line to the command, it’s the same as pressing enter when you’re done typing. Without it, the command would just sit there, looking all purdy, but not really doing anything. And now, here are the lines you can add to your ~/.inputrc for XMMS2 controls:

"\ez":"nyxmms2 prev&&sleep 0.5&&nyxmms2 current\C-M"
"\ex":"nyxmms2 play&&nyxmms2 current\C-M"
"\ec":"nyxmms2 toggle&&nyxmms2 current\C-M"
"\ev":"nyxmms2 stop\C-M"
"\eb":"nyxmms2 next&&sleep 0.5&&nyxmms2 current\C-M"
"\e-":"nyxmms2 server config equalizer.preamp $(($(nyxmms2 server config equalizer.preamp | tr -Cd \"[:digit:]-\") - 5))\C-M"
"\e=":"nyxmms2 server config equalizer.preamp $(($(nyxmms2 server config equalizer.preamp | tr -Cd \"[:digit:]-\") + 5))\C-M"

As you can see, the format is "key":"command". The \e means to use alt as a modifier. Here is a nifty little table that shows the keybindings for the code above.

Key Action
Alt+z previous track
Alt+x play
Alt+c pause
Alt+v stop
Alt+b next track
Alt+- volume down
Alt+- volume up

If you want to use the control key in your keyboard shortcut, simply replace \e\C like so:

"\C-t":"\C-k \C-utalking-clock -c &> /dev/null\n" #speak time control+t

And there you have it, keyboard shortcuts in the console. These are very useful, I have a lot of them in my ~/.inputrc and use most of them every day.

CLI Day 2014

CLI day has been a great holiday. I came up with it a few years ago to celebrate all the cool stuff you can do with the command line, and to hopefully get more people using it.
Last year, because of some events, I didn’t really do much for CLI Day. This year, it’s back and stronger than ever. I wanted to make some changes though, and since it’s my holiday, I figured what the heck, I may as well.
Someone suggested to me that CLI Day should be on May 31, because CLI in Roman Numerals is 151. Originally I wanted my birthday, may 29, to be CLI Day, but I realize the my birthday rocks all by itself, so the Roman Numeral thing is a great idea.
Second, I think CLI Day should be decentralized. So, if you have a blog or whatever, write about it. If you have a Identi.ca or Diaspora account, mension #CLIDay. Enjoy using the commandline, and share the love with others.
This year, for CLI Day, I would like to share a new git project with you. I have written, and am in the process of writing, some games for the command line. It’s definitely a work in progress still, but the games are a lot of fun. If you would like to play, you need bash 4.2+, rolldice, and sox.

git clone git://github.com/stormdragon2976/storm-games.git
Have fun, and enjoy CLI Day 2014!

Vmail CLI Email Client

Vmail is one of, if not the most awesome email client I have ever used. If you are a fan of the vim text editor, you are going to love Vmail.
The documentation on the Vmail website explains everything you need to know about usage and installing, so I will not cover usage here. I will show how to install it in Ubuntu 10.04 and higher. The suggested installation method uses RVM which was a bit tricky for me until I figured out that it needed sudo to put programs in your executable path. To install, type the following:
sudo curl -L https://get.rvm.io | bash -s stable --ruby
After it downloads it will begin the process. Read the screen, then press q to continue. Enter the source command it gives you right before your prompt reappears, or just close and reopen your terminal. Next, type:
rvm install 1.9.3
This command may take a while.
gem install vmail
To update to the latest version, simply type:
gem install vmail
again. I am currently using Vmail as my primary email client, and I am sure, after trying it you will be too. One last thing, if you would like to set a script as your signature, you can do so by placing:
signature_script: /home/USER/path/to/script
in your ~/.vmailrc

Sharing the Clipboard with the Console

Sharing the clipboard between your GUI desktop and the console can be a bit of a challenge. I was doing it by pasting into a temperary file then opening that file in the console. Then, however, I got to thinking there has to be a better way. So, I wrote a bit of code in python to automatically check the clipboard for text and write it to /tmp/clipboard. It works quite nicely, but I have noticed that when it is running, switching between applications with alt+tab is slower than normal. It may be something to do with the loop slowing things down, but I am not sure. For those who are interested, here is the code:
#Clipboard to File Written by Storm Dragon
#Copyright May 2011 by Storm Dragon
#License GPL
#This program places any text in the clipboard into the file /tmp/clipboard
#The file is updated every 0.5 seconds

#Library import section
import time
import pygtk
import gtk
#Loop forever!
while True:
    #Get the clipboard
    cb = gtk.clipboard_get()
    #assign the clipboard contents to a variable.
    cbText = cb.wait_for_text()
    if isinstance(cbText, str) == True:
        file = open(“/tmp/clipboard”,”w”)
After I completed this small program I learned of the existance of a clipboard manager called parcellite. In Ubuntu and Vinux you can install it with:
sudo apt-get install parcellite
You can adjust parcellite’s preferences by right clicking on it in the panel and selecting preferences. If you left click it you will get the clipboard’s contents and the history up to 100 previous selections depending on the setting in preferences. You can also access the clipboard history with the keyboard shortcut control+alt+h. In order to have parcellite start when you login, you will need to add it to startup applications in System, Preferences, Startup Applications. If you choose to use my script you can add it to startup applications instead.
If you use parcellite you can access the clipboard history in the console in the file located at:
Because it is a binary file it does not work in Gedit.
If you use my program or the clipboard manager glipper it will work in gedit. The file my program writes to is:
My program does not contain any history, only the last text in the clipboard.
After a bit more research I find I prefer using the clipboard manager Glipper:
sudo apt-get install glipper
To access the clipboard press control+alt+c. To access the history in the consolesimply open the file:
Of course, if you use glipper you do not need my script.
Parcellite also has the ability to copy text from the terminal, gnome-terminal or any terminal opened from the desktop. If you try from the console you get an error about not being able to open the display. If you do:
echo “hello world” | parcellite
then the words "hello world" will be in your clipboard. You can accomplish the same thing by using a program called xclip:
sudo apt-get install xclip
To place something in the clipboard:
echo “hello world” | xclip -selection clipboard
You can download Clipboard to File by right clicking the link and selecting save link as.
After some descussion it was decided that probably the best way to cut out the lag caused by clipboard-to-file is to drop the loop completely and just bind the program to a keyboard shortcut. So, here is the new code, the download link will now also get you this code as well:
#Clipboard to File Written by Storm Dragon
#Copyright May 2011 by Storm Dragon
#License GPL
#This program places any text in the clipboard into the file /tmp/clipboard

#Library import section
import time
import pygtk
import gtk
#Get the clipboard
cb = gtk.clipboard_get()
#assign the clipboard contents to a variable.
cbText = cb.wait_for_text()
if isinstance(cbText, str) == True:
    file = open(“/tmp/clipboard”,”w”)
I went to System, Preferences, Keyboard Shortcuts and added clipboard-to-file and set its shortcut to control+alt+v. This new method has all of the coolness with none of the slowness.
One more thing that will make sharing info between the GUI desktop and the console easier is a paste command for the IRC client irssi. I actually have 2 of them. These use assume you are using glipper. The first simply pastes the last thing in your clipboard history to irssi and sends it as a message:
/alias paste /exec -o cat /home/USER/.glipper/history | head -n 2 | tail -n 1
the other is for when you want to paste several lines. Each line will be sent as a message so be careful with this one. Irssi will prompt you if you try to send more than seven lines, so there is a safety net:
/alias read /exec -o cat /tmp/clipboard
To use this one just make sure the text you wanto to send as a message is in the file /tmp/clipboard.

Facebook Comes to the Command Line

I have been searching for a way to access Facebook from the command line for a while now. I don’t use Facebook all that much, I prefer Twitter, but I do have a lot of friends who use Facebook. So, I created an account, and fortunately got the Twitter application working for it before they broke (disabled) it for new users. So, to make a long story short, the only updating my Facebook account gets is usually done from my Twitter stream. Facebook, to me, just seems kind of clunky to use with a browser, that and there aren’t many accessible clients for it, so the only way to use it was with a browser. I recently got an Android phone and it adds another way to access Facebook but I really don’t use that method much either. Then, my friend Burt Henry found fbcmd. Fbcmd is a command line application written in PHP for Facebook. It is really easy to get installed. To do so, first install php by typing:
sudo apt-get install php5-CLI
Then get the fbcmd software by typing:
wget --no-check-certificate https://github.com/dtompkins/fbcmd/raw/master/fbcmd_update.php
If you are wondering about the certificate flag in the above command it is there because wget gives an error for github’s certificate. It is really the destination it claims to be. After the download completes, type the following two commands:
sudo php fbcmd_update.php
sudo php fbcmd_update.php install
Then, if you would like to verify that everything installed correctly, type:
You should get a short help message describing the procedure for granting authorization to fbcmd. if everything goes OK you can now remove the installation package using the command:
rm fbcmd_update.php
Now, to grant authorization to fbcmd type:
fbcmd go access
This will open your default browser, most likely Firefox if you are in Gnome, you will need to click allow. Next, type:
fbcmd go auth
When you click the allow button here you will be given a six6 character authorization code. I had trouble copying it to the clipboard with Orca, so you may have to memorize it long enough to type it in to terminal:
fbcmd auth XXXXXX
Where XXXXXX is your code.
Now, to see what your friends have been up to while you were busy installing this really cool program, type:
fbcmd stream
To set your status:
fbcmd status 'Thinks Thoughts of a Dragon is the greatest blog in the whole world, no, the whole universe!'
when you read through your stream you will notice each item is numbered. You can comment on the post by typing:
fbcmd comment 3 "If you need help with your diabolical world domination plans just let me know."
This will of course reply to the third post in your stream which was hopefully about diabolical world domination and not cute little bunnies, although cute world dominating bunnies might be kind of cool.
For a full list of commands and all kinds of great help visit the fbcmd wiki. You can also get help on a command by typing fbcmd help command as in:
fbcmd help status
I foresee all kinds of neat cron stuff for this application. If you think of any example feel free to share with everyone in the comments.

Commanding the Command Line (Part 3)

It’s finally here! The third installment of Commanding the Command Line. And this time I have some great goodies for you like…

Fun With Scripting

Bash scripting could and probably should have a religion devoted to its glory. It’s powerful, simple for the most part, and if you know anything about using the command line you already know some about bash scripting. If you want to read a great book that is free and will teach you all you need to know and more about scripting with bash then read the Advanced Bash-Scripting Guide. So now you want a good use for all this knowledge? How about a signature script for your email client like Evolution or Thunderbird. Here’s a script that will change part of your signature while keeping some things the same each time. the html tags are necessary to make it display correctly in Evolution. You can right click the link and select "save link as" to download it. For Evolution save the script in ~/.evolution/signatures/random-signature.sh and set the permission to executable with:
chmod 700 ~/.evolution/signature/random-signature.sh
then start Evolution, and under Edit, Preferences, Composer Preferences select Signatures. Select the Add Script button, add it as random-signature, then select ~/.evolution/signatures/random-signature.sh as the signature script. Finally, to make it the default signature for your e-mail. From the Preferences page select your email account, press enter on edit then select random-signature from the drop-down box.
If you happen to be a fan of the CLI email client Alpine you can use the random signature by editing the file ~/.pinerc. Search for the line that reads signature-file= and put the path to the signature file:
Notice the | at the end of the file name so Alpine knows to execute it as a script.
With Alpine though, you do not need the div and pre tags, in fact they just show up in the message and ruin your otherwise beautiful signature. Bash to the rescue again. All you have to do is check for a variable that is set when you are in Gnome or your prefered desktop that isn’t set in the console. In Ubuntu and Vinux, using Gnome, this works:
if [[ -n $COLORTERM ]] ; then
echo "<div>-- </div>
echo "-- 
Thunderbird it is a little more tricky. You have to point Thunderbird to your signature.txt and change the above script to write its contents to the txt file every time it is ran. But how do you get the script to run and change the file thereby making it random? Simple, you schedule the signature script to run at intervals using…

Scheduling with Crontab

Cron jobs are great things. They run a command at specified times. It can be once a day, once a week, once a month, multiple times a day, month, etc. Each job takes 6 parameters. In order they are:

  1. minute from 0 to 59
  2. hour from 0 to 23
  3. Day of month varies depending on the month
  4. Month 1 through 12
  5. Day of Week 0 through 7 0 and 7 are both Sunday
  6. Command

To specify that the task should run for each occurance use the * in place of the number. To have something run at several different occurances but not every one use a , between each number like
used in the minute field would run the task at 5, 25, and 55 minutes in the hour or hours specified. To make it run the command for a specific period of time say every minute from 5 to 10 in the hour use a – like this:
The above example will run the task at 5, 6, 7, 8, 9, and 10 minutes after the specified hour.
Now, for some working examples:
0 6,18 * * * espeak "hello world"
This not so useful example will make your computer say hello world using the Espeak synthesizer at 6:00AM and 6:00PM every day. while the following:
0 12 * * * crontab -l > /home/USER/crontab.bak
will back up your crontab jobs to your home directory under the name crontab.bak every day at 12:00PM. So, finally, if we wanted to run the signature script which we have modified to write to the .txt file we use as our thunderbird signature we could do:
* * * * * /home/User/path/to/random-signature.sh
This cause the script to run every minute of every day changing your signature to a new random saying each time it happens.
Of course you need to change the signature slightly to write to the .txt file you use as your signature in Thunderbird. It’s not a big change, just edit these lines in the original script:
echo "<div>-- </div>" > /home/USER/path/to/signature.txt
echo "<pre>
</pre>" >> /home/USER/path/to/signature.txt
#end code
Another great use, if you have TTYtter set up, is to use Cron to wish your Twitter contacts happy birthday. this way you remember to tell them happy birthday and you get a reminder that it is their birthday all at the same time.


Aliases are shortcuts to commands. Basically you can say one thing and mean something much longer. You can even change how commands behave by aliasing the command. A great example of this is the date command. If you open terminal and type date you will get something like this:
Mon Jan 17 22:50:47 EST 2011
But by creating an alias for date you can get something you may find easier to read like this:
Monday, January 17, 2011
To set up these aliases open a file in your home directory called .bash_aliases:
gedit ~/.bash_aliases
and put aliases in the form:
alias shortcut="command"
Here is the date command aliased to the format I have above:
alias date="date +'%I:%M%p%n%A, %B %d, %Y'"
After you save the file your date alias will be nearly ready to go. the only thing you have to do after adding an alias before you can use it is source your .bashrc. So, type the command:
source ~/.bashrc
Now when you type the word date you should get the more readable format. If you want the previous version for some reason just prepend it with a \ character:
If it does not work you may want to check your .bashrc file for the correct lines to load the alias file:
gedit ~/.bashrc
If you do not find the following code then you may want to add it to the file:
if [ -f ~/.bash_aliases ] ; then
. ~/.bash_aliases
If you find the code but each line begins with a # character it means the code has been commented out. Code that is commented will not run, so all you have to do to fix it is remove the # from the 3 lines of code.

Bash One Liners

To further show off the power of bash here are a collection of one line commands that can do some really impressive things. This section will grow as I find or think of good examples. And now, some truly awesome code:
#Although I strongly believe everyone should use .ogg files I know that is not always possible.
#Convert files in current directory to mp3
#Using unrestricted version of sox:
for i in ./*.*;do sox "$i" "${i%.*}.mp3";done
#Using ffmpeg from medibuntu or compiled:
for i in ./*.*;do ffmpeg -i "$i" "${i%.*}.mp3";done
#Get current weather condition and 24 hour forecast:
zipcode="YourPostalCode";echo "$(elinks -dump "http://weather.yahooapis.com/forecastrss?p=${zipcode}&u=f" | grep -A 4 "Current Conditions:")"
#Run a script on the web, make sure you read the source first or trust the site:
curl http://trustedsite.com/bashscript.sh | bash

Video In The console

There are two ways to do this, you can use aaxine:
sudo apt-get install xine-console
and then:
aaxine path/to/video.avi
You may need to specify an audio device as in:
aaxine -A pulseaudio path/to/video.mpg
You can accomplish the same thing using libcaca and mplayer. to get libcaca:
sudo apt-get install libcaca0
then play a video with:
mplayer -af volnorm -vo caca path/to/video.avi

Shell-fm, a Command Line Last.fm Player

I was searching for a good command line last.fm player to use on my netbook. Command line apps really have an advantage on netbooks because of their speed. The player I chose is shell-fm. It is easy to configure and use, and has a nifty ability that makes it, in my opinion, easily the best choice. You can run other command line commands from inside shell-fm and, better still, bind the command to a keypress. I will show you why this is so awesome in just a sec, but first, installation.
Although you can install shell-fm from the repositories with:
sudo apt-get install shell-fm
you will probably want to compile it from source. The latest version has built in volume controls using the + and – keys. To compile from source open terminal and type:
sudo apt-get install git-core
sudo apt-get build-dep shell-fm
git clone http://github.com/jkramer/shell-fm.git
cd shell-fm/
sudo make install PREFIX=/usr MANDIR=/usr/share/man
When it is finished installing switch back to your home directory by typing:
Create the .shell-fm/ directory by typing:
mkdir .shell-fm/
mkdir .shell-fm/cache/
then create the shell-fm configuration file:
gedit ~/.shell-fm/shell-fm.rc
There are several things you can put in this file. I only have three or four lines in mine though. The format is:
variable = setting
Here is a sample of what you can put in it. Replace USER with your Last.fm user name and PASSWORD with your Last.fm account password. Note that only upper case words should be changed:
username = USER
password = PASSWORD
title-format = Now playing %t by %a from %l
screen-format = Now playing %t by %a from %l
term-format = Now playing %t by %a from %l
default-radio = lastfm://user/USER
The last line loads your chosen radio station when shell-fm opens. If you use the default-radio line above with your user name the station that plays is your last.fm library. If you would like to automatically download free songs, add the next line replacing USER with your home directory:
download = /home/USER/Downloads/%a – %t.mp3
Downloaded tracks will be saved in your ~/Downloads directory.
And now, as promised, I will show you some extra coolness. If you have installed TTYtter, Here is a script that uses TTYtter to tweet the currently playing song. To get it set up open terminal and type the following line:
wget --output-document ~/.shell-fm/tweet.sh http://www.stormdragon.tk/scripts/tweet.sh
chmod 700 ~/.shell-fm/tweet.sh
Finally, the key binding thing I mentioned earlier. In your ~/.shell-fm/shell-fm.rc add the following line. Replace USER with the name of your home directory (usually your login name):
key0x74 = /home/USER/.shell-fm/tweet.sh %t %a %l %T
This binds the tweet script to the lower case letter t. the key format uses the HEX value of the ASCII character. You can get the HEX value using a Hex to ASCII Converter. The key must be entered as:
key0xHEXNUMBER = command
Shell-fm also has the ability to run a command when a song starts or when it ends. One use for this is to set your status in Pidgin to the currently playing track. To do this, open your ~/.shell-fm/shell-fm.rc and add the line:
np-cmd = /usr/bin/purple-remote ‘setstatus?status=available&message=Listening to %t by %a from %l’
If you do it this way though your status may have a lot of \ characters in it. To avoid this, put it in a script and call it like the tweet script above without the URL. Here is status script. Save it in your ~/.shell-fm/ directory and call it like this:
np-cmd = /home/USER/.shell-fm/status.sh %t %a %l
Don’t forget to change permission to 700 with:
chmod 700 ~/.shell-fm/status.sh
To get instructions on using shell-fm type:
man shell-fm
or if you are running shell-fm type:
for a list of commands.

Command Line Spell Checker

Sometimes you may want to spell check a word without having to open a browser or a word processor. In a situation the command line can once again come to the rescue. To get the spell checker, in a terminal, type:
sudo apt-get install hunspell hunspell-en-us
After the installation has completed you can do:
and type in each word you want checked. If the word is spelled correctly it will display *. If the word is not correct it will offer suggestions. Another way to check a word is to type:
echo “word” | hunspell
To make things even easier, you can create a file named spellcheck in ~/bin/ and add the following lines:
echo “$@” | hunspell
exit 0
Save the file and change its permissions by typing:
chmod 700 ~/bin/spellcheck
Now you can check words by typing:
spellcheck word to check
the above line should yield 3 * symbols. So, the next time you need to check a single word to paste in to an application, open a terminal and get the correct spelling in a few seconds.

  • Tip Jar