2016-12-29 11:25:39 +01:00
|
|
|
# Astuces Bash
|
|
|
|
|
|
|
|
~~~
|
|
|
|
function hello { echo Hello; echo $1; }
|
|
|
|
~~~
|
|
|
|
|
|
|
|
## Raccourcis
|
|
|
|
|
|
|
|
~~~
|
2018-03-06 10:59:11 +01:00
|
|
|
Ctrl+d : quitte le terminal courant / supprime le caractère sous le curseur si la ligne n'est pas vide
|
|
|
|
Ctrl+h : supprime le caractère avant curseur
|
2016-12-29 11:25:39 +01:00
|
|
|
Ctrl+a : aller en début de ligne
|
|
|
|
Ctrl+e : aller en fin de ligne
|
|
|
|
Ctrl+k : effacer (coupe) du curseur à la fin de la ligne
|
|
|
|
Ctrl+u : effacer (coupe) du début de ligne au curseur
|
|
|
|
Ctrl+y : colle la partie précédemment coupée
|
|
|
|
Ctrl+r : rechercher parmi l'historique
|
|
|
|
Ctrl+s : freeze l'affichage de l'output
|
|
|
|
Ctrl+q : défreeze l'affichage de l'affichage de l'output
|
|
|
|
Ctrl+t : inverse les caractères autour du curseur
|
|
|
|
Ctrl+c : annule la ligne en cours et passer sur une nouvelle ligne vide
|
|
|
|
Ctrl+z : suspend la tâche en cours
|
|
|
|
ctrl+l : efface/rafraichit l'écran
|
2020-07-20 17:59:12 +02:00
|
|
|
ctrl+w : efface le mot qui précède le curseur jusqu'au séparateur de mot (une espace en général)
|
2018-03-06 10:59:11 +01:00
|
|
|
ctrl+x ctrl+e : édite la ligne dans $VISUAL ou $EDITOR si non définie
|
2016-12-29 11:25:39 +01:00
|
|
|
alt+effacer : Efface un mot à gauche du curseur
|
|
|
|
alt+d : Efface un mot à droite du curseur
|
2018-08-16 11:07:15 +02:00
|
|
|
alt+t : Inverse les deux mots à gauche du curseur
|
2017-03-15 11:01:46 +01:00
|
|
|
~~~
|
|
|
|
|
2023-02-07 11:33:54 +01:00
|
|
|
## Traduire les espaces insécables en espaces
|
|
|
|
|
|
|
|
Dans le fichier `~/.inputrc` :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
# espace insécables et espaces fine insécables -> espace
|
2023-08-04 16:56:31 +02:00
|
|
|
"\xc2\xa0": " "
|
|
|
|
"\xe2\x80\xaf": " "
|
2023-02-07 11:33:54 +01:00
|
|
|
~~~
|
|
|
|
|
2023-08-04 16:48:53 +02:00
|
|
|
## Rendre la complétion insensible à la casse
|
|
|
|
|
|
|
|
Dans le fichier `~/.inputrc` :
|
|
|
|
|
|
|
|
~~~
|
|
|
|
set completion-ignore-case On
|
|
|
|
~~~
|
|
|
|
|
2017-03-15 11:01:46 +01:00
|
|
|
# Script
|
|
|
|
|
2017-03-15 11:10:09 +01:00
|
|
|
## Variables
|
|
|
|
|
2017-03-15 11:29:27 +01:00
|
|
|
### Environnement
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
$PPID
|
|
|
|
$BASHPID
|
|
|
|
$!
|
|
|
|
$$
|
2017-03-15 18:00:21 +01:00
|
|
|
$PIPESTATUS
|
2017-03-15 11:29:27 +01:00
|
|
|
~~~
|
|
|
|
|
2017-03-15 11:10:09 +01:00
|
|
|
### Initialiser
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
var=
|
|
|
|
~~~
|
|
|
|
|
|
|
|
En readonly <=> constante
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
readonly var="pas touche"
|
|
|
|
~~~
|
|
|
|
|
|
|
|
### Protéger
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
[ -n "${var}" ] && true
|
|
|
|
#et surtout pas
|
|
|
|
[ -n $var ] && false
|
|
|
|
#car si var est vide, l'expression sera équivalente à [ -n ] => erreur de syntaxe
|
|
|
|
~~~
|
|
|
|
|
|
|
|
~~~{.bash}
|
2017-07-05 23:35:29 +02:00
|
|
|
echo $var "joue au ${foo}t"
|
2017-03-15 11:10:09 +01:00
|
|
|
#et surtout pas
|
|
|
|
echo $var "joue au $foot"
|
|
|
|
#car sinon c'est bien le contenu de la variable $foot qui sera remplacé et non $foo
|
|
|
|
~~~
|
|
|
|
|
2017-03-15 11:29:27 +01:00
|
|
|
## Conditions
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
true && echo "C'est toujours vrai"
|
|
|
|
false || echo "Ça sera toujours vraiment faux"
|
|
|
|
[ $? -eq 0 ] && { echo "tâche"; sleep 1; echo -e "\e'a plus!!" }
|
|
|
|
~~~
|
|
|
|
|
2017-03-15 11:38:32 +01:00
|
|
|
### test
|
|
|
|
|
2017-03-15 16:54:37 +01:00
|
|
|
## Boucles
|
|
|
|
|
2017-03-15 17:43:44 +01:00
|
|
|
«Liste» :
|
|
|
|
|
2017-03-15 16:54:37 +01:00
|
|
|
~~~{.bash}
|
|
|
|
for i in "valeur1 valeur2prisavec1" valeur3 valeurn; do echo $i; done
|
|
|
|
~~~
|
|
|
|
|
|
|
|
«Incrémentale» :
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
for ((i=0; i<10; i++)); do echo $i; done
|
|
|
|
#ou
|
|
|
|
for i in $(seq 1 10); do echo $i; done
|
2017-03-15 17:35:47 +01:00
|
|
|
#ou
|
|
|
|
for i in {1..10}; do echo $i; done
|
2017-03-15 16:54:37 +01:00
|
|
|
~~~
|
|
|
|
|
|
|
|
«Conditionnelle» :
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
file=; while [ -f "$file" ]; do sleep 10; touch $file; done
|
|
|
|
~~~
|
|
|
|
|
2017-03-15 11:29:27 +01:00
|
|
|
## Processus
|
|
|
|
|
|
|
|
~~~{.bash}
|
2017-03-15 16:58:37 +01:00
|
|
|
( echo "Je suis un fils du script principal, mais on attend que je meurs."; exit 0; )
|
2017-03-15 11:29:27 +01:00
|
|
|
( echo "Libreee !"; yes "Libre je dis !"; ) &
|
|
|
|
sleep 10 && kill $! #on tue le dernier fils créé
|
|
|
|
~~~
|
|
|
|
|
|
|
|
> Note: Dans une boucle, ne pas créer de process via *(* *)* sinon un usage comme **break** ou **continue**, ... ne fonctionnera pas :
|
2017-03-15 11:29:46 +01:00
|
|
|
>
|
2017-03-15 11:29:27 +01:00
|
|
|
> ~~~{.bash}
|
|
|
|
> while :
|
|
|
|
> do
|
|
|
|
> : && { echo "Stop !"; break; }
|
|
|
|
> done
|
|
|
|
> # ( echo "Stop !"; break; ) dans cet exemple ne quittera pas la boucle -car break dans un process fils-, et donc restera infini
|
|
|
|
> ~~~
|
|
|
|
|
|
|
|
## Astuces [concrètes]
|
|
|
|
|
|
|
|
### Récupérer tout stdin dans une variable
|
2017-03-15 11:01:46 +01:00
|
|
|
|
2017-03-15 11:29:27 +01:00
|
|
|
#### Complet
|
2017-03-15 11:01:46 +01:00
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
var="$(cat <&0)"
|
|
|
|
#ou
|
|
|
|
var="$(cat -)"
|
|
|
|
~~~
|
|
|
|
|
2017-03-15 11:29:27 +01:00
|
|
|
#### Ligne par ligne
|
2017-03-15 11:01:46 +01:00
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
var=
|
|
|
|
while read ligne
|
|
|
|
do
|
2017-03-15 11:10:09 +01:00
|
|
|
var="${var}${ligne}"
|
2017-03-15 11:01:46 +01:00
|
|
|
done <&0
|
2017-03-15 11:29:27 +01:00
|
|
|
~~~
|
|
|
|
|
|
|
|
autrement :
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
cat <&0 | (while read ligne; do ... done)
|
2017-03-15 13:13:15 +01:00
|
|
|
~~~
|
|
|
|
|
|
|
|
### Écrire un fichier temporaire [unique]
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
nomfichier=$(mktemp)
|
|
|
|
#pour un répertoire
|
|
|
|
nomrep=$(mktemp -d)
|
|
|
|
~~~
|
|
|
|
|
2017-06-28 11:57:15 +02:00
|
|
|
> Note: La création d'un fichier temporaire n'implique pas côté système une suppression automatique de ce dernier.
|
|
|
|
|
2017-06-28 12:03:16 +02:00
|
|
|
### Gérer arguments donné au script
|
|
|
|
|
|
|
|
Exemple :
|
2017-06-28 11:57:15 +02:00
|
|
|
|
|
|
|
~~~{.bash}
|
2017-06-28 12:03:16 +02:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
DELAY=
|
|
|
|
NUMARG=0
|
|
|
|
FICHIER=
|
|
|
|
|
|
|
|
while :
|
|
|
|
do
|
2017-06-28 11:57:15 +02:00
|
|
|
|
2017-06-28 12:03:16 +02:00
|
|
|
[ $# == 0 ] && break
|
|
|
|
|
|
|
|
OPTIND=1
|
|
|
|
while getopts ":d:n" opt "$@"
|
|
|
|
do
|
|
|
|
case "$opt" in
|
2017-06-28 12:07:25 +02:00
|
|
|
d) DELAY=$OPTARG; (( NUMARG+=1 )) ;;
|
|
|
|
n) NOMAIL=true; (( NUMARG+=1 )) ;;
|
|
|
|
:) >&2 echo "Manque un argument avec cette option." ;;
|
|
|
|
*) >&2 echo "$0 [-d DELAY] [-n] [FILE]"; exit 1 ;;
|
2017-06-28 12:03:16 +02:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
shift $((OPTIND-1))
|
|
|
|
|
2017-06-28 12:07:25 +02:00
|
|
|
#Savoir si après toutes les options, une chaîne de caractère présente pour FILE
|
2017-06-28 12:03:16 +02:00
|
|
|
[ -z "$1" ] && break
|
|
|
|
|
|
|
|
#FICHIER=$1 si FICHIER non initialisé
|
2017-06-28 12:07:25 +02:00
|
|
|
[ -z "$FICHIER" ] && FICHIER=$1 || { >&2 echo "Fichier en trop."; break; }
|
2017-06-28 12:03:16 +02:00
|
|
|
shift
|
|
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "==RESULTAT=="
|
|
|
|
|
|
|
|
echo "ARG " $NUMARG
|
|
|
|
echo "FICHIER=" $FICHIER
|
|
|
|
echo "DELAY=" $DELAY
|
|
|
|
echo "NOMAIL=" $NOMAIL
|
|
|
|
|
|
|
|
exit 0
|
2017-06-28 11:57:15 +02:00
|
|
|
~~~
|
|
|
|
|
2017-09-26 13:49:45 +02:00
|
|
|
Permettra par exemple :
|
2017-09-26 13:50:06 +02:00
|
|
|
|
2017-09-26 13:49:45 +02:00
|
|
|
~~~
|
|
|
|
./cmd -d 2 -n monfichier
|
|
|
|
./cmd -d2 monfichier
|
|
|
|
./cmd monfichier -d 2 -n
|
|
|
|
./cmd -n monfichier -d2
|
|
|
|
~~~
|
|
|
|
|
2018-10-17 22:33:56 +02:00
|
|
|
### Passer arguments de facon optionelle
|
2018-10-17 22:44:19 +02:00
|
|
|
|
2018-10-17 22:33:56 +02:00
|
|
|
${var:+..} peut etre utile
|
2018-10-17 22:44:19 +02:00
|
|
|
|
2018-10-17 22:33:56 +02:00
|
|
|
~~~{.bash}
|
2018-10-17 22:46:48 +02:00
|
|
|
$ in_uid=1009 in_login=app_user adduser \
|
2018-10-17 22:33:56 +02:00
|
|
|
--gecos "User $in_login" \
|
2018-10-17 22:46:48 +02:00
|
|
|
--disabled-password "$in_login" \
|
|
|
|
${in_uid:+'--uid' "$in_uid"}
|
2018-10-17 22:33:56 +02:00
|
|
|
~~~
|
|
|
|
|
2017-06-28 11:57:15 +02:00
|
|
|
### Lire les commandes intégrés dans BASH
|
|
|
|
|
|
|
|
#### Lister fonctions
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
$ typeset -F
|
|
|
|
$ typeset -f #pour lister contenu de la fonction avec
|
|
|
|
~~~
|
|
|
|
|
|
|
|
#### Voir contenu
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
$ type FUNCTION
|
|
|
|
~~~
|
|
|
|
|
|
|
|
Pour ceux «built-in», pas possible :
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
$ type getopts
|
|
|
|
getopts is a shell builtin
|
2017-09-26 13:45:40 +02:00
|
|
|
~~~
|
|
|
|
|
|
|
|
## Utiliser résultat xargs en milieu de commande
|
|
|
|
|
|
|
|
~~~{.bash}
|
|
|
|
$ echo coucou | xargs -i echo {} c\'est moi!
|
2023-02-07 11:33:54 +01:00
|
|
|
~~~
|