Bash Notes

Edit and Execute Command

Hitting the key sequence Ctrl-X Ctrl-E opens the command line buffer in an editor, then executes the output as a command. (The $EDITOR environment variable is used to select the editor binary.)

To see all available key bindings run bind -P. To rebind the command to a simpler key combination, e.g. Ctrl-O, add the following line to your .inputrc file:

"\C-o": edit-and-execute-command

Interactive Move Command

When I use the mv command I often want to move the file in question to a slightly modified version of its current path. This little wrapper function saves on typing:

function mv {
    if [ $# -ne 1 ]; then
        command mv "$@"
        return
    fi
    read -ei "$1" new_filename
    mv -v "$1" "$new_filename"
}

If you supply two or more arguments the default mv command will run. If instead you supply a single argument you'll be given a chance to edit that argument using the standard line-editing shortcuts, then the file will be renamed to the edited string.

Moving more than one file? There's a tool for that.

Job Control

Hitting Ctrl-Z while a process is running temporarily suspends that process and restores control to the shell. In the shell, the jobs command lists all currently active and suspended processes. Use the fg command to restart a suspended process in the foreground or the bg command to restart a suspended process in the background. Both comands take a numerical ID argument, available from the jobs command, e.g.

$ fg %1

To start a process in the background append an ampersand to the command:

$ sometask &

History Scrolling

By default Ctrl-P (previous) and Ctrl-N (next) scroll backwards and forwards through the command history. This feature becomes much more powerful if you enable prefix-matching by adding the following lines to your .inputrc file:

"\C-p": history-search-backward
"\C-n": history-search-forward

With these settings, only commands matching the prefix you've already typed will be matched.

Jump Around

I think using the 'z' jump command has improved my everyday experience of Bash more than any other single tip, trick, or technique I've ever learned.

This command tracks your most used directories and lets you jump to fuzzily-matched directory names ranked by frecency, a combination of frequency and recency.

Fix syntax highlighting in Vim

Vim really seems to struggle with syntax highlighting for Bash scripts. Adding the following line to your .vimrc file forces Vim to use its builtin Zsh syntax plugin for all shell scripts:

autocmd BufNewFile,BufRead *.sh set filetype=zsh

Surprisingly, this actually works a lot better for Bash scripts than the default Bash plugin.

Check if a file exists

if test -f /path/to/file; then
    echo "file exists"
fi

Check if a file does not exist

if ! test -f /path/to/file; then
    echo "file does not exist"
fi