Episode: 1197
Title: HPR1197: What I do with bash scripts
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr1197/hpr1197.mp3
Transcribed: 2025-10-17 21:26:34

---

Hi, this is John Culp in Lafayette, Louisiana, and this will be my very first solo podcast
for HPR.
I did one with NY Bill at one point about shopping at Goodwill, and I'm answering now the
call that Hacker Public Radio has recently put out for new podcasters because apparently
there are not very many in the queue.
And the trouble with me is not necessarily the desire to record a podcast, but the lack
of topic.
And so I decided I would go ahead and talk about something that interests me, and hopefully
it will interest listeners as well.
I'm not an IT professional.
I am a music professor in Lafayette, Louisiana, however I do have pretty good skills on the
computer and in Linux and so forth.
And what I wanted to talk about today was the way I use scripting in my everyday life.
I wrote my first script, I don't know, four years ago maybe, when I was listening to
a podcast by Chess Griffin called Linux Reality.
And he had a couple of episodes about scripting and starting out with just very basic things
where you stored one or two commands in a file and then ran it and let it, I think my
first script was something like it listed the contents of my documents directory and
stored that output in a file.
And very soon I got a little bit more sophisticated where I could grab command line arguments and
do things to them and stuff like that.
And now it's at a point where I really don't know what I would do if I could not use
the scripts that I've written and that make my life easier on a day-to-day basis.
The scripts I use fall into a few different categories and I've tried to kind of list
a few in each category.
I would not dream of talking about all of the scripts that I use because there are more
than a hundred in my personal bin directory.
But one category is the syncing slash backup type of script.
Another one handles compiling.
Another category is conversions of files from one format to another.
I have some system type scripts that check on the status of various things and then I've
also got fun scripts where the sole purpose is to do something fun just because you can
with a script.
I'll get to those last.
The first category, syncing and backup, I use these all the time pretty much every day.
I've got a couple that will make backups of important files like my password database
for keypass X.
Whenever I add a new password to entry to that, I will run my password backup script and
it will take the key file and copy it to a remote location where I use it like on my
work computer or where I keep a backup of it.
I also have one that I use to copy the public key directory that I have or I guess the
public key ring that I have for my email.
A bunch of us who met each other on Identica and status net have formed an encrypted email
mailing group and whenever somebody new joins the group and my key ring changes, I will make
a backup of the public key ring and so I have a script that does that.
It uses an rsync command and actually it's a secure copy, not rsync.
But I just in the script, I tell it where the source file is, what the destination is,
and then I give it the command.
You could type this out as a command but it's hard to remember the IP address and which
port the remote server uses and all that, it's just much easier to store it in a script.
Same thing with my address book, if I change something in the address book, I'll run my
address book sync script and that will copy the source file to the various places where
I use the address book.
One of the most important ones to be on a daily basis is my iPod syncing script.
I have an old iPod, I'm very proud of the fact that my iPod is from around 2005 and
I'm still using it after two battery changes and for the last four years or so running
open source firmware on it, the rockbox firmware.
But every day I get podcasts and then I sync it up.
Now this one is a little bit more sophisticated than the other syncing scripts because I run
a couple of sanity checks.
The first one checks just to make sure that the iPod is actually mounted.
So it'll, it goes in and looks in the media directory or somewhere.
I can't remember exactly how.
I've gone through a couple of different ways of finding whether the iPod is mounted or
not.
Anyway, it checks.
If it doesn't find it, it just exits with the message, hey, you need to plug in your
iPod.
It's not there.
If it does find the iPod, then it runs an R sync command that will sync up my podcast
directory with the iPod and that includes not only copying stuff over but deleting podcasts
that I've already listened to.
So that one is useful.
Another one that I came up with that I really like, I call stick.
I actually wrote a blog post about this one.
The stick script is one that I use to stick files on servers.
For me, this was a way to make the secure copy command easier because secure copy is an
excellent way to transfer files from my local machine to the various servers that I have
running or to my office machine or whatever.
But secure copy is difficult to type out every time because you have to remember either
the IP address or the host name or whatever.
And I also have SSH running on different ports on almost every machine and I just can't
remember what port they are all on.
And so what I did was I wrote a script that will take the first command line argument.
So the command will be stick and then I will say stick to something so it will be stick
space server name and whatever the server name is will be in the file somewhere and so
I have an if then, what do you call it, an if then statement I suppose.
So if the server name is x then port is y and then it sets all of the variables accordingly.
And then it will transfer that file to the home directory on the remote server.
This has been enormously helpful to me because if I need to stick a file somewhere, I just
go stick file name and then server actually it will be the second command line argument.
The first command line argument is the file name that I'm going to be transferring.
So it will be stick fubar.text server and that's how it works.
I really like the stick script.
I use it all the time.
Now the another category of scripts that I have is for compiling stuff.
I do a lot of documents and my music notation software all use source files that then need
to be run through some kind of converter or something.
So I use lilypon for my music notation files and it's possible to run a lilypon command
at the command line by typing it straight out without too much trouble but there are lots
of command line options that you can put with lilypon and I like to use a number of those
and it would really be a pain to have to remember what they are and to type them out every
time.
I have a script that helps me with those and it would be pretty boring to go into all
the details of that but it is save me tons and tons of time having that.
There's also another lilypon related one that I use for running the lilypon book command
which also has many command line options and you have to specify output directories and
output formats and all of this and I've scripted all of that where I just have to type a single
command and then the first command line argument is the file upon which I'm running it and
that really simplifies things a lot.
I have similar scripts to deal with my markdown files and my lot tech files and stuff like
that.
Another category of scripts I have is for text manipulation and these are ones where
I'm trying to save either me or someone else a lot of time by automating something that
can be automated.
For example, just a few days ago I was faced with the task of reading nearly 100 essays
written by my students in a big music appreciation class and when I go to look at those essays
on Moodle what I have to do is go to where all the essays are and click on a link which
then has a pop-up window with the students essay in it and then right now our Moodle theme
is all messed up so I also had to maximize that window to be able to see all of the text
and I have to read it, click out of the window, enter a grade, click on the next essay and
this ends up being quite a lot of clicking and maximizing and closing and I did not want
to have to do that for 100 files but there's also an option there to download all of the
essays in a zip file so I tried that and found that it did not download all of the essays
as one big file but as 91 different HTML files.
Now this is not a whole lot better because I would have to open up every single one and
close it and read it and so forth.
What I did was I wrote a script that will cycle through every single one, rename the file
so that it removes the spaces in the file name because Linux and Unix type things don't
like spaces and file names so the first thing I do is get rid of all the spaces and file
names then I add some heading material for the HTML like I tell it that I want to use
the UTF-8 character set and that I want the maximum width to be 40 m dash m space I'm
not sure what that is I say max width is 40 em web developers will know what that is
because I just found it online somewhere but it limits the width of the text and it
makes it more readable and so I put that at the very top and then I just start cycling
through every single one of these HTML files and appending the contents of it to the file
and at the beginning and end of each of the students essays I also put the students name
saying begin you know John Doe then their essay and end John Doe and then put a horizontal
rule so I don't get one essay mixed up with another so anyway and the upshot is after
about less than a second it's finished concatenating all of these essays in one big page and it
opens it up in my browser so I can just scroll straight down the page and see all of them
and this really made my life easier see I have another category of scripts that are for
converting things from one format to another and the the tool that I found amazingly useful
for this kind of thing especially when dealing with images is the suite of tools called net
pbm just perfect for scripting there are tools in there to convert just about any kind of format
into any kind of other format and so I have one that I call image to image where it'll take an
input file that is some kind of image png or jpeg or jiff or whatever and then you can choose
whatever output format you want and it will run the conversion for you I've got one that I call
thumb that I wrote when I wanted to have an easy way to make a thumbnail image to upload as an
avatar for user forums or things like that and it also uses the net pbm suite of tools and it
asks for user input like it'll ask what the input format is and then ask how many pixels wide
you want it to be and then it'll just run it for you there's one that I wrote for rotating an
image it asks you which direction you want it to rotate 90 degrees positive or 90 degrees negative
and it will do that for you another conversion script that I just did recently that I'm very pleased
is one that will take a markdown input file and convert it to lottex now this is not entirely
my own work there's a guy named fletcher pinney wrote the program called multi markdown which
uses markdown syntax but extends its flexibility a bit by making other things possible like alternate
output formats besides just html one of those output formats is lottex but what I found is that
when you run that and use lottex output it does not produce an output that is ready to compile
to sorry to compile with pdf lottex or anything like that it is missing the preamble it's missing the
end document command at the very end and so forth so I wrote a script that will put in the preamble
that I want then it will run multi markdown and redirect all of that output and append it to
the file that has my preamble and then it will put the closing end document and so forth but then
before it is finished it will run back through and check to see if I've used any utf8 international
characters like accent to characters or characters that have umlauts on them or things like that
because lottex does not deal with those very well you have to format them in a specific way using
curly braces and accent marks and things like that and so my script will go through and check to see
if I have any of those characters and if so it will convert them to be ready for lottex to compile
so that's one I'm really proud of and let's see I also have some scripts for doing system
stuff one of my the ones I use the most is called c just se and that's when I want to see what the
process is of or the process id is of a certain process it's basically it takes ps
space a-u-x pipe grip and it will store all of that part of the command and all I have to do is say
let's say I want to I don't know thunderbird or firefox or something is frozen up and I need to find
the process id to kill it I'll say see thunderbird and it will run that and give me the output
I also wrote a script that I call my ip that will show me what my ip address is on the various
network interfaces that I have at the moment it essentially uses the ip space a-d-d-r command
and strips out everything in there that is not the ip address
is one thing that's always kind of annoyed me about the running the command ip space a-d-d-r
is that it does give you the ip address but there's all kinds of other information that I don't
necessarily want and so my script will just tell me the ip address and which interface it's on
let's see also wrote a script for updating my moodle instance I have my own instance of
moodle at home and it's running from git it's tracking the stable branch and I found that it was
difficult to keep it updated because not only is the main tree tracking git but I've got a few
modules that are also tracking git in different places and so I'd have I first of all could not
remember which modules they were because many modules are in the core and then others are ones
that I've added and I couldn't remember which ones were which so I just stored everything in a script
and then I run the script and it'll go into each part of the file tree that has a git
um a git repository and then check and see if there's any new code if there is it'll grab it
then when it's gotten all the new code it'll ask if I want to run the update script for moodle
that that upgrades the database tables and so that one has been a big help
another script I use every day it's not a system one at all but has to do with media is mash
potter mash potter is chess griffin's modification of bash potter and I like mash potter because
of the different file naming conventions but I've also added some modifications to it
and mostly but because of a single podcast that I listen to every day it's a sports radio
podcast and for whatever reason in the last two months or so when the sports broadcasting guy
changed networks and they started using a new file name and convention that is completely random
as far as I can tell and so it'll pull in the episodes but the file names give the media player
no indication as to which episode it's supposed to come first well I mean this podcast actually
has three different files for it every single day it's a three hour long show and sometimes it'll
get the file names out of order and this really annoyed me so I added some lines to mash potter
that would go into that specific directory where the sports podcast went and use the MP3 info
command to get the ID tags from it and use that information from specifically from the title tag
to rename each of those files in a sane way and so now once my script is run
I have the three episodes every day that are renamed so that they appear in the correct order
in my iPod I also wrote a script or another few lines in there
that checks for shorter portions of that same podcast so what they do is every day they'll give you
the three hours of the show but also they'll put in extra smaller segments of the show just with
interviews of different people that the guys talk to that day and I don't want the shorter ones I
just want to listen to the whole show straight few sorry straight through and so I wrote a couple
of lines and added it to mash potter that will go in there and check the file size of each of those
things using the find command and when it finds any files that are smaller than 20 megabytes it
just deletes those and leaves the ones that I want that's been a very helpful script
now the last category of scripts that I use are just the fun and silly ones I have a weather script
that will well it checks the weather at I forget where it is um let me see here
use acuweather.com I use the e-links text-based web browser and just dump the contents to a temporary
file and then I use grip, awk, said, whatever commands like that to extract the information I want
and then format it in a way that will fit in like a micro blog kind of post and then I have the
information posted to my status net timeline by my cat my cat dingle he's got his own account on
there and when I type the weather command it does all this stuff finds the information and then
posts a message from dingle on my timeline telling me the weather conditions and the forecast so
gives me some information but it's also just meant to be kind of a fun script and one that you do
just because you can I have another one related to weather where I use cow say cow say is one of those
great unix programs where you type in a string and a cow in asky text will tell you what you typed
in well I found out that there are more than 40 different cow say asky images and so I wrote a
script that will randomly choose a number first what it does is it locates all of those cow say
image asky files and then counts how many there are and then chooses a random number that will fall
in that range and uses that one to choose the image to use for the day and I've got this running on
a script that every morning I think at 5 a.m my server runs this and then emails me a weather update
just telling me what the temperature is and you know it's it's just kind of fun I thought it was
fun to be able to script an email message and to learn how to do a random number and choose a
different cow let's see I've got another one that my cat does is generates a random password and
and post it to my status netline I call this security kiddies password of the day and so I what I
can do with that one is by default it will choose a 24 character password but I could supply a
command line argument of any number I want so I could do a password space 16 and it would generate
a 16 character random password and then post the message to my timeline from my cat
what else here I've got another script related to cow say which will just cycle through all of the
various cow say files and have the cows and images say the same thing for everyone just so you can
see what all the images are that one's kind of fun I wrote a couple of scripts that were for either
me or my kids to practice memorizing information for example when my kids were younger and they
didn't know our phone numbers I wrote this script that will ask them whether they want to try their
moms or their dad's phone number and then they would type in the number and it would tell them
whether they got it right or not if they missed it it would ask them to try again or if they wanted
to exit and so this is how they learned how to remember our phone numbers and then I have one
that I call the password test whereas if I if I've decided that I want to start using a different
password that I have to type in I mean most of my passwords are I keep in my password database and
I don't even know what they are but if I need to learn a new password that I'm going to have to
type before I start using it I will test myself on it dozens of times to make sure I'm not going
to forget it and so I have a script that asks me to type it in and then tells me whether I got
it right or not and I think that's really about it I will probably post some of these scripts on
my website for you to view I don't think it would really be necessary to post all of them
unless somebody just really wants to see them but none of these really go that deep into script
foo I'm not that good at it but I just find that I can I've learned how to do certain things and
they really help me in my day-to-day life even though I'm not an IT professional so I hope you
enjoy that and maybe I'll be back some time to do another podcast if I can think of what to talk
about see you later
you have been listening to Hacker Public Radio at Hacker Public Radio does our
we are a community podcast network that releases shows every weekday Monday through Friday
today's show like all our shows was contributed by a HBR listener by yourself if you ever
consider recording a podcast then visit our website to find out how easy it really is
Hacker Public Radio was founded by the digital dot-pound and new
phenomenon computer cloud HBR is funded by the binary revolution at binwreff.com
all binwreff projects are crowd-responsive by lunar pages from shared hosting to custom
private clouds go to lunar pages.com for all your hosting needs unless otherwise stasis
today's show is released on the creative commons attribution share a line
