Bash tips & tricks (part 1)

Today I learned another really cool thing bash can do and then I thought it is worth it to start sharing various tips and tricks. Most of them arise from the fact that everything is file in *nix.

Some of the tips are actually borrowed from awesome application called enki.

Incognito mode

Situations when disabling command history appending is needed. To temporary disable command logging use:

set +o history

To enable logging again:

set -o history

Modes

bash supports vi and emacs modes. The default mode is emacs (all the shortcuts like Ctrl-E or Ctrl-A). To enable vi mode type:

set -o vi

Vi input mode is actually a part of GNU readline, so it can be used virtually everywhere in CLI. To set it, use .inputrc file.

# ~/.inputrc

set editing-mode vi

Vitrual files

There are several device files inside /dev directory. These are not actual files on disk, rather they provide an interface to access various useful character data streams. Some of such files:

/dev/null

# Redirect all complains to the black hole
modprobe somemodule 2>/dev/null

/dev/zero

# Infinite supply of zeros
# Remove partition table from the disk
dd if=/dev/zero of=/dev/sdX bs=1M count=5

/dev/random

/dev/urandom

/dev/tcp

This one is actually pretty amazing

# Check if postgres is alive.
# Look Ma, no netcat or nmap!

echo -e "HEAD / HTTP/1.0\n" >/dev/tcp/localhost/5432 && echo 'alive!'

/dev/udp

See /dev/tcp.

/dev/stdout

Not quite useful in bash itself, but it can be used inside configuration files.

# nginx.conf

access_log /dev/stdout;

Piping

Bash is suited for text manipulation very well, like most of CLI commands do. Passing text data back and forth becomes trivial operation with pipes.

# Read what 'ps' says and filter strings containing word 'ruby'
ps -a | grep ruby
# 'pv' is 'dd' on steroids. 'tee' reads stdin, duplicates it both to $1 and stdout
pv <livecd.iso | sudo tee /dev/sdX >/dev/null
# Transfer files though pipe via ssh. Useful application are:

# - writing files as non-root user with root permissions
cat file | ssh noroot@example.com "sudo tee /root/file"

# - compressing data over ssh
tar -cpz mydir/ -O | ssh user@example.com "tar xp"
# A long pipeline

ldconfig mybinary | grep '^lib' | uniq | sort | tee libs.txt

That’s it for this time. Since bash is so powerfull, there’s definitely more hacks coming!

SHOW COMMENTS (0)