Outils pour utilisateurs

Outils du site


tech:bash_bonnes_pratiques

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
tech:bash_bonnes_pratiques [2025/05/27 09:32] Jean-Baptistetech:bash_bonnes_pratiques [2026/04/21 10:46] (Version actuelle) Jean-Baptiste
Ligne 1: Ligne 1:
 +<!DOCTYPE markdown>
 +{{tag>Bash Script Console}}
  
 +Voir :
 +* https://google.github.io/styleguide/shellguide.html
 +* https://github.com/google/styleguide/blob/gh-pages/shellguide.md
 +* http://www.kfirlavi.com/blog/2012/11/14/defensive-bash-programming
 +* http://www.linuxjournal.com/content/working-functions-towers-hanoi
 +* https://github.com/icy/bash-coding-style
 +* http://redsymbol.net/articles/unofficial-bash-strict-mode/
 +* http://mywiki.wooledge.org/BashFAQ/105
 +* https://blog.yossarian.net/2020/01/23/Anybody-can-write-good-bash-with-a-little-effort
 +* https://github.com/icy/bash-coding-style?tab=readme-ov-file#deprecation
 +* https://www.reddit.com/r/linuxadmin/comments/9x1ist/what_are_your_conventions_with_bashshell_scripts/
 +* https://www.linkedin.com/pulse/bash-scripting-conventions-engin-polat
 +* https://gist.github.com/the-glima/39905476c82a8acf9c81b7cfe08e5f03
 +* https://github.com/chenkaie/junkcode/blob/master/bash/Defensive-BASH-Programming.sh
 +* https://bertvv.github.io/cheat-sheets/Bash.html
 +* https://medium.com/better-programming/defensive-programming-to-create-a-robust-ish-shell-script-d9f21292d08a
 +* https://frippertronics.com/posts/defensive_bash_programming.html
 +* https://blog.seboss666.info/2020/04/programmation-defensive-en-bash/
 +* https://devhints.io/bash
 +* https://kvz.io/blog/bash-best-practices.html & https://github.com/kvz/bash3boilerplate/
 +* http://unix.stackexchange.com/questions/8759/best-practice-to-use-in-bash
 +
 +
 +
 +
 +# Bash Les bonnes pratiques
 +
 +Faire des tests unitaires avec bats
 +
 +
 +## Les pièges 
 +
 +~~~bash
 +rm -rf $var1/$var2
 +~~~
 +
 +Si ''$var1'' et ''$var2'' sont vides on un un jolie 
 +
 +Solution : nounset
 +
 +~~~bash
 +#! /bin/bash
 +set -o nounset
 +~~~
 +
 +et quand nécessaire utiliser
 +~~~bash
 +[[ -z "${foo:-}" ]]
 +~~~
 +
 +Don’t use:
 +~~~bash
 +  cd "${foo}"
 +  [...]
 +  cd ..
 +~~~
 +but
 +~~~bash
 +  (
 +    cd "${foo}"
 +    [...]
 +  )
 +~~~
 +Voir https://bertvv.github.io/cheat-sheets/Bash.html
 +
 +
 +## Les forks bombes
 +
 +.bashrc
 +newgrp
 +
 +Solution [[ulimit]]
 +
 +Voir
 + 
 +
 +
 +## Les tubes nommés (pipes)
 +
 +Source : https://blog.g3rt.nl/retain-exit-status-code-through-pipe.html
 +
 +FIXME : traduire en Français
 +
 +How to retain exit status codes through pipes in Bash scripts
 +
 +Suppose you have a line
 +
 +~~~bash
 +mysqldump | pigz
 +~~~
 +
 +in your script. Then the exit status code will be of gzip, rather than mysqldump, while the most likely process to fail here is mysqldump.
 +
 +To fix this, add this at the top of your bash scripts:
 +~~~bash
 +set -o pipefail
 +~~~
 +
 +
 +## Arrêt du script lors de la moindre erreur
 +
 +Voir http://redsymbol.net/articles/unofficial-bash-strict-mode/
 +
 +~~~bash
 +set -euo pipefail
 +~~~
 +
 +~~~bash
 +#!/bin/bash
 +set -euo pipefail
 +IFS=$'\n\t'
 +~~~
 +
 +
 +## if $? SC2181
 +
 +Source : https://www.shellcheck.net/wiki/SC2181
 +
 +Code problématique 
 +~~~bash
 +make mytarget
 +
 +if [[ $? -ne 0 ]]
 +then
 +  echo "Build failed"
 +fi
 +~~~
 +
 +Code Correct
 +~~~bash
 +if ! make mytarget;
 +then
 +  echo "Build failed"
 +fi
 +~~~
 +
 +
 +
 +
 +## Test
 +
 +https://github.com/chriscool/sharness
 +
 +
 +
 +## Conventions de nommage
 +
 +
 +
 +Environment variables or shell variables introduced by the operating system, shell startup scripts, or the shell itself, etc., are usually all in CAPITALS1.
 +
 +To prevent your variables from conflicting with these variables, it is a good practice to use lower_case variable names.
 +
 +
 +## Autres
 +
 +A la place de mkdir, privilégier ''install -d''
 +
 +~~~bash
 +#mkdir /tmp/plop
 +install -d /tmp/plop
 +~~~
 +
 +
 +Préférer un ''unlink'' à ''rm'' pour supprimer un  lien symbolique

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki