---
Title: How I use bash
Date: 2021-06-04 06:20:00
Summary: This is how I use bash, as I presented it at « En attendant la PyCon Fr ».
---

# bash

I presented this as a lightnign talk at [« En attendant la PyCon
Fr »](https://discuss.afpy.org/t/en-attendant-la-pyconfr-du-15-avril-2021/222/),
there's [a video
(in french)](https://dl.afpy.org/en-attendant-la-pycon-fr-2020-2021/2021-04%20Bash%20-%20trucs%20&%20astuces%20-%20mdk.mp4).


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 !!

```bash
$ 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.
