cheat: mieux que les manpages pour vos commandes Linux

Quel développeur ou quel administrateur système n’a jamais pesté sur la syntaxe d’une commande Unix ou Linux ? Qui ne s’est pas perdu dans les man pages sans trouver ce qu’il cherchait ?

On a alors souvent recours à un fichier « fourre-tout » avec nos commandes favorites pour les retrouver lorsqu’elles ne sont plus dans l’historique de Bash.

Heureusement, il y a le projet cheat qui rassemble pour vous les usages les plus courants de vos commandes favorites. C’est donc un ensemble de cheatsheets, antisèches en Français, plus exhaustif que les examples fournis par --help et évidemment moins précis que la man page.

Un exemple avec grep:

$ cheat grep
# To search a file for a pattern:
grep <pattern> <file>

# To perform a case-insensitive search (with line numbers):
grep -in <pattern> <file>

# To recursively grep for string <pattern> in <dir>:
grep -R <pattern> <dir>

# Read search patterns from a file (one per line):
grep -f <pattern-file> <file>

...

Mais cheat permet aussi de définir vos propres antisèches, soit pour remplacer celles de la communauté soit pour vos propres scripts ou commandes.

1. Installer Cheat

On télécharge:

user@debian:~$ wget https://github.com/cheat/cheat/releases/download/3.10.1/cheat-linux-amd64.gz -O cheat.gz
user@debian:~$ gzip -d cheat.gz 

Puis on installe:

user@debian:~$ mv cheat bin/
user@debian:~$ chmod u+x bin/cheat

2.Configuration

Au premier lancement de cheat:

user@debian:~$ cheat
A config file was not found. Would you like to create one now? [Y/n]: Y
Would you like to download the community cheatsheets? [Y/n]: Y
Cloning into '/home/user/.config/cheat/cheatsheets/community'...
remote: Enumerating objects: 502, done.
remote: Counting objects: 100% (502/502), done.
remote: Compressing objects: 100% (340/340), done.
remote: Total 502 (delta 185), reused 453 (delta 157), pack-reused 0
Receiving objects: 100% (502/502), 125.50 KiB | 755.00 KiB/s, done.
Resolving deltas: 100% (185/185), done.
Created config file: /home/user/.config/cheat/conf.yml
Please read this file for advanced configuration information.

La commande nous propose de:

  • Créer un fichier de configuration
  • Télécharger les community cheat sheets (qui ne font pas partie du projet cheat)

Si vous allez voir le fichier de configuration /home/user/.config/cheat/conf.yml, vous verrez la définition des cheat sheets « community » (qu’on vient de cloner), ainsi que celle des « personal », c’est à dire les vôtres:

  # If you have personalized cheatsheets, list them last. They will take
  # precedence over the more global cheatsheets.
  - name: personal
    path: /home/user/.config/cheat/cheatsheets/personal
    tags: [ personal ]
    readonly: false

Ensuite, rien ne vous empêche d’avoir un dépôt Git pour vos « personal cheat sheets » et de référencer son répertoire de clone dans le fichier de configuration de cheat.

3. Utilisation

Pour utiliser cheat, rien de plus simple:

user@debian:~$ cheat cheat
# To see example usage of a program:
cheat <command>

# To edit a cheatsheet
cheat -e <command>

# To list available cheatsheets
cheat -l

# To search available cheatsheets
cheat -s <command>

# To get the current `cheat' version
cheat -v

Par exemple pour la commande gzip:

user@debian:~$ cheat gzip
# To create a *.gz compressed file
gzip test.txt

# To create a *.gz compressed file to a specific location using -c option (standard out)
gzip -c test.txt > test_custom.txt.gz

# To uncompress a *.gz file
gzip -d test.txt.gz

# Display compression ratio of the compressed file using gzip -l
gzip -l *.gz

# Recursively compress all the files under a specified directory
gzip -r documents_directory

# To create a *.gz compressed file and keep the original
gzip < test.txt > test.txt.gz

Cela ne se voit pas ici, mais la sortie de la commande cheat est colorisée, ce qui se paramètre avec les propriétés colorize, style et formatter du fichier de configuration.

Par exemple:

# Should 'cheat' always colorize output?
colorize: true

# Which 'chroma' colorscheme should be applied to the output?
style: monokai

# Which 'chroma' "formatter" should be applied?
# One of: "terminal", "terminal256", "terminal16m"
formatter: terminal256

Si vous allez voir le contenu des « cheat sheets » de la communauté, vous verrez qu’il s’agit de fichiers texte tout simples.

Il vous appartient alors soit:

  • de contribuer aux « cheat sheets » de la communauté
  • de définir vos propres « cheat sheets »

Une dernière chose: cheat supporte la complétion Bash.

Feature branches en ligne de commande

La plupart des entreprises utilisent Git pour développer et des « features branches » pour intégrer les nouveaux développements ou les corrections de bugs sur la branche principale, le « master ».

Donc, si comme moi vous utilisez Git et GitLab professionnellement ou pour des projets personnels, vous faites tout cela de l’une des deux façons suivantes:

  • Avec l’interface graphique de GitLab et les possibilités d’IntellJ IDEA
  • En ligne de commande avec les commandes git

On va donc voir dans ce billet comment on peut procéder avec la deuxième façon de faire: la ligne de commande.

1. Un project existant

On va supposer que notre projet de développement existe sur GitLab et qu’on peut le cloner par exemple:

git clone git@framagit.org:grumpyf0x48/my-software.git

2. La branche master

D’un qu’un premier commit a été effectué sur la branche principale, « master », on peut voir les branches existantes avec:

$ git branch --all --list
* master
  remotes/origin/master

3. Créer une branche

Maintenant, on souhaite développer une fonctionnalité « myfeature » et on va donc créer une branche du même nom.

On peut le faire de deux façons.

En deux commandes

On crée la branche puis on se positionne dessus:

$ git branch myfeature
$ git checkout myfeature

En une commande

$ git checkout -b myfeature

4. Implémenter la fonctionnalité

Par la suite, on va modifier et/ou ajouter des fichiers et faire un certain nombre de commits.

5. Valider la fonctionnalité

Une fois qu’on a terminé, on va valider nos modifications par un push sur le serveur:

$  git push
fatal: La branche courante myfeature n'a pas de branche amont.
Pour pousser la branche courante et définir la distante comme amont, utilisez

    git push --set-upstream origin myfeature

Et là, on se fait jeter ! Ce qui est normal puisque notre nouvelle branche n’existe pour l’instant que localement.

Heureusement, git nous donne la commande à passer:

$ git push --set-upstream origin myfeature
Décompte des objets: 3, fait.
Delta compression using up to 8 threads.
Compression des objets: 100% (3/3), fait.
Écriture des objets: 100% (3/3), 371 bytes | 0 bytes/s, fait.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: To create a merge request for myfeature, visit:
remote:   https://framagit.org/grumpyf0x48/my-software/-/merge_requests/new?merge_request%5Bsource_branch%5D=myfeature
remote: 
To git@framagit.org:grumpyf0x48/my-software.git
 * [new branch]      myfeature -> myfeature
La branche myfeature est paramétrée pour suivre la branche distante myfeature depuis origin.

On peut aussi utiliser:

$ git push -u origin myfeature

6. Créer une merge request

Ce qui est bien, c’est que le serveur GitLab nous propose d’emblée un lien pour créer une merge request à partir de nos modifications !

Nous n’avons plus qu’a lancer:

$ firefox https://framagit.org/grumpyf0x48/my-software/-/merge_requests/new?merge_request%5Bsource_branch%5D=myfeature &

7. Conclusion

Si vous souhaitez créer une branche et qu’elle soit visible sur GitLab sans aller sur l’interface graphique de ce dernier, il vous suffit de passer les deux commandes suivantes:

$ git checkout -b myfeature
$ git push -u origin myfeature