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