Terminals are sexy is a curated list of Terminal frameworks, plugins & resources for CLI lovers. There is plenty of links to applications, plugins and configurations. For me personally, the most useful one was the link to sensible Bash configuration.
Tag: bash
Defensive BASH Programming
If you write any Bash code that lasts more than a day, you should definitely read “Defensive BASH Programming” and follow the advice, if you haven’t already. It covers the following:
- Immutable global variables
- Everything is local
- main()
- Everything is a function
- Debugging functions
- Code clarity
- Each line does just one thing
- Printing usage
- Command line arguments
- Unit Testing
All that with code examples and explanation of importance.
dotfiles – your unofficial guide to dotfiles on GitHub
Warning: you will lose a lot of sleep if you follow the link below. :)
No matter how well you know Vim, bash, git, and a whole slew of other command line tools, I promise you, you’ll find something new, something you had no idea existed, something that will help you save hours and hours of your life by shaving off a few seconds here and there on the tasks you perform on a daily basis, in the repositories link to from this site.
I think I’ve spent most of my Sunday there and my dotfiles are so different now that I’m not sure I should commit and push them all in one go. I think I might need to get used to the changes first.
Some of the things that I’ve found for myself:
- PHP Integration environment for Vim (spf13/PIV).
- myrepos – provides a
mr
command, which is a tool to manage all your version control repositories. - bash-it – a community Bash framework.
- Awesome dotfiles – a curated list of dotfiles resources.
… and a whole lot of snippets, tips, and tricks.
P.S.: Make sure you don’t spend too much time on these things though :)
Shell parameter expansion : default values for shell script parameters
When writing shell scripts, it’s often useful to accept some command line parameters. It’s even more useful to have some defaults for those parameters. Until now I’ve been using if statements to check if the parameter was empty, and if it was, to set it to the default value. Something like this:
#!/bin/bash DB_HOST=$1 DB_NAME=$2 DB_USER=$3 DB_PASS=$4 if [ -z "$DB_HOST" ] then DB_HOST="localhost" fi if [ -z "$DB_NAME" ] then DB_NAME="wordpress" fi if [ -z "$DB_USER" ] then DB_USER="root" fi echo "Connecting to the database:" echo "Host: $DB_HOST" echo "Name: $DB_NAME" echo "User: $DB_USER" echo "Pass: $DB_PASS"
It turns out there is a much more elegant way to do this with shell parameter expansion. Here is how it looks rewritten:
#!/bin/bash DB_HOST=${1-localhost} DB_NAME=${2-wordpress} DB_USER=${3-root} DB_PASS=$4 echo "Connecting to the database:" echo "Host: $DB_HOST" echo "Name: $DB_NAME" echo "User: $DB_USER" echo "Pass: $DB_PASS"
This is so much better. Not only the script itself is shorter, but it’s also much more obvious what is going on. Copy-paste errors are much less likely to happen here too.
I wish I learned about this sooner.
Troubleshooting with /dev/tcp and /dev/udp
Imagine you are on a freshly installed Linux machine with the minimal set of packages, and you need to test network connectivity. You don’t have netcat, telnet, and your other usual tools. For the sake of the example, imagine that even curl and wget are missing. What do you do?
Well, apparently, there is a way to do this with plain old bash. A way, which I didn’t know until today. You can do this with /dev/tcp and /dev/udp. Here is an example verbatim from the Advanced Bash-Scripting Guide:
#!/bin/bash # dev-tcp.sh: /dev/tcp redirection to check Internet connection. # Script by Troy Engel. # Used with permission. TCP_HOST=news-15.net # A known spam-friendly ISP. TCP_PORT=80 # Port 80 is http. # Try to connect. (Somewhat similar to a 'ping' . . .) echo "HEAD / HTTP/1.0" >/dev/tcp/${TCP_HOST}/${TCP_PORT} MYEXIT=$? : <<EXPLANATION If bash was compiled with --enable-net-redirections, it has the capability of using a special character device for both TCP and UDP redirections. These redirections are used identically as STDIN/STDOUT/STDERR. The device entries are 30,36 for /dev/tcp: mknod /dev/tcp c 30 36 >From the bash reference: /dev/tcp/host/port If host is a valid hostname or Internet address, and port is an integer port number or service name, Bash attempts to open a TCP connection to the corresponding socket. EXPLANATION if [ "X$MYEXIT" = "X0" ]; then echo "Connection successful. Exit code: $MYEXIT" else echo "Connection unsuccessful. Exit code: $MYEXIT" fi exit $MYEXIT