The main reason I prefer Unix/Linux over Windows operating systems is the terminal. Nix terminal shells just feel cleaner and organized to me than that of CMD or PowerShell. I won't claim to be an all knowing expert on the subject, I can only speak on what I've experienced, but the preference is 95% based on the feel of it overall. The Unix CLI philosophy and POSIX standards provide us with a powerful and versatile tool with simple commands that each do one thing and do it well. Spend some time typing out some PowerShell 'one-liners' then jump in a Nix terminal and I am willing to bet you will at least understand.
Bash has been around a long time with version 0.99 being released in 1989. It's mature, programmable and versatile. Bash is the default shell of many popular linux distributions and used to be the default for Mac
OS before the switch to zsh. Some common commands we use are actually shell scripts (e.g gunzip, ldd and which). I am not a Bash programming expert, but I try.
OS before the switch to zsh. Some common commands we use are actually shell scripts (e.g gunzip, ldd and which). I am not a Bash programming expert, but I try.
Some rules I keep in mind when tackling scripting are:
- if I do something more than 3 times I should write a script. (popey says this)
- a command should do one thing, and do it well. (unix philosophy-ish)
When building websites, image resizing is tedious. Responsiveness has complicated things. Remember when you only viewed websites on one device? I do, I also remember when we didn't have websites at all. These days, thanks to HTML by Tim Berners Lee, not only can you view porn as fast as your connection, but you can view it in multiple ways on many devices. Anyway, I have decided I want scripts for doing a few different things. This article covers creating multiple sizes of an image to use as a srcset to demonstrate how I use Bashly to overcome my limited knowledge and experience.
Bashly itself is written in ruby and can be installed using gem.
Note:
If Ruby isn't installed on your computer consult the official documentation for instructions. MacOS comes with a version of Ruby installed but attempting to install using the system gem command will result in a persmissions error. To install a newer version of ruby locally so as not to interfere with the systems version I recommend using a tool version manager. Personally I use asdf.
Once Bashly installs successfully you should be able to start building your CLI.
Starting a project is simple and if you visit the Bashly home page, theres a cool animation that shows the steps.
- create a directory for your project
- cd into the directory
- run 'bashly init' or 'bashly init --minimal'
These steps should leave you with a directory that looks like this:
|- myProject
|- src
|- bashly.yaml
|- root_command.sh
The file 'bashly.yaml' is where the Bashly magic starts. Here is the yaml for my srcset command:
A quick breakdown of what I have in there and why:
- variables - I set some globals here when I started and had the functions split up into different scripts, but then didn't change it once I just put everything into the root_command script so my editor would stop complaining about undeclared variables.
- dependencies - this script requires imagemagick to be installed and placing this here inserts a check automatically so if you try to run the script on a system without imagemagick installed it errors out.
- args - this of course is a file name. i did not add required to this because i do checking in the script and allow input from pipe (/dev/stdin).
Once the bashly.yaml is complete, you will find 'root_command.sh', also in the src directory. This is where you would put your main code. I'm guessing for larger more complex applications it would be ideal to have the common library functions split into separate files for organization and you can create support or this with the 'bashly add lib' command. This command creates a subdirectory named 'lib' in the src folder, and here you can create seperate files containing functions that can be accessed by any part of your code. I was being bugged by shellcheck in zed editor about undeclared variables and it was bothering me so I moved all my code to the root_command.sh file. This isn't a big deal because the code is pretty simple and most of the heavy lifting of creating and parsing the command line and using getopts is handled by bashly. In the end (at this point anyway) this is what my root_command.sh file looks like:
Code for this project can be found on github here.
Comments, corrections, suggestions all welcome :).
ascii text: figlet
responsive imgaes: https://gist.github.com/jeromeabel
you suck at programming: https://ysap.sh/





Comments
Post a Comment