How I use bash

Posté le ven. 04 juin 2021 dans blog

bash

I presented this as a lightnign talk at « En attendant la PyCon Fr », there's a video (in french).

How to read:

When I write ^A it mean I press Ctrl-A, which is noted C-a (bash/emacs notation).

M-a means Meta-a (it's left alt on current keyboards).

I avoid singleline prompt

Because of the following issue:

PS1='$ '
printf "pouette"
ls^A
ls -l^A

Issue is: readline have two ways to move at the beginning of a line, and have no way to know where the cursor is, and assume the line start at column 0.

Easy, daily, shortcuts

Killing and Yanking from the killing stack

  • C-a C-k: Move to the beginning, then kill the line.
  • C-y, M-y: Yank and yank pop.

Example:

$ git push origin HEAD^A^Kgit commit -m "FIX"^A^Kgit add -u
C-y
Enter
C-y
M-y
Enter

Moving

  • C-a (beginning of line) C-e (end of line).
  • C-p and C-n: like up and down arrows, to browse history.

Avoid C-pC-pC-pC-pC-p or ↑↑↑↑↑↑, use C-r.

Fixing typos

  • C-t (swap chars), M-t (swap words).
  • M-l, M-u, M-c (lowercase, uppercase, capitalize)
  • C-g (abort)

Cleaning

C-l (clear screen). Oh, if it's not enough, like after killing sl, use reset, so ENTER reset ENTER to ensure you type it in a clear line, or C-a C-k reset ENTER to avoid executing blindly.

sudo !!

$ man bash | grep '!!'
!!     Refer to the previous command.  This is a synonym for `!-1'.

so:

$ apt upgrade
E: ... are you root?
$ sudo !!
sudo apt upgrade
...

Globstar

shopt -s globstar:

$ rm **/*.md

same as:

$ find -name '*.md' -delete

example:

sed -i '1i#!/usr/bin/env python3' **/*.py

Other shortcuts I use

And I like them for the nice symetry:

  • C-f to move forward a char, M-f to move forward a word.
  • C-b to move backward a char, M-b to move backward a word.
  • C-d to delete a char, M-d to delete a word.

Pipelines for the win!

$ man bash | grep -C1 C-a
Commands for Moving
    beginning-of-line (C-a)
        Move to the start of the current line.

Subshells for the win!

emacs $(git grep -l PATTERN)

Bonus

Those are the same in emacs, save brain space, use emacs.