Top 5 Bash Functions
Here are a few bash functions that I find myself using all the time.
Functions are great where you have something that's slightly more
complex than an alias, or wants to parse out its arguments, but
isn't big enough to turn into a proper script. Drop these into your
~/.bashrc file (and source ~/.bashrc) and you're good to go!
Hope one or two of these are helpful/interesting.
1. ssht
Only came across this one fairly recently, but it's nice - you can
combine the joys of ssh and tmux to drop you automagically into
a given named session - I use sshgc (with my initials), so as
not to clobber anyone else's session. (Because ssh and then
tmux attach is so much typing!)
ssht() {
local SESSION_NAME=sshgc
command ssh -t "$1" tmux new-session -A -s $SESSION_NAME
}
2. lead
lead is a combination of ls -l and head, showing you the most
recent N files in the given (or current) directory:
lead() {
if [[ "$2" =~ ^[0-9]+$ ]]; then
command ls -lt "$1" | head -n $2
else
# This version works with multiple args or globs
command ls -lt "$@" | head -n 30
fi
}
Or if you're using exa instead of ls,
you can use:
lead() {
if [[ "$2" =~ ^[0-9]+$ ]]; then
command exa -l -s newest -r --git --color always "$1" | head -n $2
else
command exa -l -s newest -r --git --color always "$@" | head -n 30
fi
}
Usage:
# Show the 30 most recent items in the current directory lead # Show the 30 most recent items in the given directory lead /etc # Show the 50 most recent items in the current directory lead . 50 # Show the most recent items beginning with `abc` lead abc*
3. l1
This ("lowercase L - one", in case it's hard to read) is similar
in spirit to lead, but it just returns the filename of the most
recently modified item in the current directory.
l1() {
command ls -t | head -n1
}
This can be used in places where you'd use bash's !$ e.g. to edit
or view some file you just created:
solve_the_meaning_of_life >| meaning.txt cat !$ 42! # OR: cat `l1`
But l1 can also be used in situations where the filename isn't
present in the previous command. For instance, I have a script that
produces a pdf invoice from a given text file, where the pdf name is
auto-derived from the text file name. With l1, I can just do:
invoice ~/Invoices/cust/Hours.2107 evince `l1`
4. xtitle
This is a cute hack that lets you set the title of your terminal to the first argument that doesn't being with a '-':
function xtitle() {
if [ -n "$DISPLAY" ]; then
# Try and prune arguments that look like options
while [ "${1:0:1}" == '-' ]; do
shift
done
local TITLE=${1:-${HOSTNAME%%.*}}
echo -ne "\033]0;"$TITLE"\007"
fi
}
Usage:
# Set your terminal title to 'foo' xtitle foo # Set your terminal title to the first label of your hostname xtitle
I find this nice to use with ssh (or incorporated into ssht above) e.g.
function sshx() {
xtitle "$@"
command ssh -t "$@"
local RC=$?
xtitle
return $RC
}
This (hopefully) sets your terminal title to the hostname you're ssh-ing to, and then resets it when you exit.
5. line
This function lets you select a particular line or set of lines from a text file:
function line() {
# Usage: line <line> [<window>] [<file>]
local LINE=$1
shift
local WINDOW=1
local LEN=$LINE
if [[ "$1" =~ ^[0-9]+$ ]]; then
WINDOW=$1
LEN=$(( $LINE + $WINDOW/2 ))
shift
fi
head -n "$LEN" "$@" | tail -n "$WINDOW"
}
Usage:
# Selecting from a file with numbered lines: $ line 5 lines.txt This is line 5 $ line 5 3 lines.txt This is line 4 This is line 5 This is line 6 $ line 10 6 lines.txt This is line 8 This is line 9 This is line 10 This is line 11 This is line 12 This is line 13
And a bonus alias:
alias bashrc="$EDITOR ~/.bashrc && source ~/.bashrc"