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