# Travail terminé, corrections

**URL:** <https://www.debian-fr.org/t/travail-termine-corrections/33195>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 2:54 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195 "2016-02-21T02:54:53Z")\
**Posts on this page:** 20\
**Page:** 2

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/21 "2016-02-21T02:55:06Z")

</div>

> [@ricardo](#):
>
> Autre méthode pour tester TOUT le DDext ?

fais ton choix 😉 :

```auto
# 1
fdisk /dev/sdb <<< q &>/dev/null && echo "device /dev/sdb ok" || echo "device /dev/sdb ko" # nécessite d'être root
# 2 - si tu utilises udev
udevadm --query=name --name=/dev/sdb &>/dev/null && echo "device /dev/sdb ok" || echo "device /dev/sdb ko"
# 3 - full bash (attention, les parenthèses sont importantes car l'utilisation de shopt effectue une modification de l'environnement d'exécution)
( shopt -s nullglob; devices=( /dev/sdb* ); [["${devices[@]}" ]] ) && echo "device /dev/sdb ok" || echo "device /dev/sdb ko"
# version avec les if 
if ( shopt -s nullglob; devices=( /dev/sdb* ); [["${devices[@]}" ]] )
then
   echo "device /dev/sdb ok"
else
   echo "device /dev/sdb ko"
fi
```

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/22 "2016-02-21T02:55:07Z")

</div>

J’ai encore modifié : c’est bon ce qui suit :

[code]ddext=’/dev/sdb9’  
ddext2=’/dev/sdb10’  
autre=’/mnt/autre’

if [! -e $ddext] || [! -e $ddext2]  
then  
echo "Le DDext ne répond pas"  
else  
[-d $autre] || echo "Le dossier de montage n’existe pas !"  
read -p 'sauve ou sauve2 ? : ’ part  
if [$part = sauve]  
then  
sudo mount -t ext3 $ddext $autre  
elif [$part = sauve2]  
then   
sudo mount -t ext2 $ddext2 $autre  
else   
echo "mauvaise entree"  
fi  
fi[/code]

---

<div class="post-metadata">

**Author:** ![eol](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/b782af/32.png) [@eol](https://www.debian-fr.org/u/eol)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/23 "2016-02-21T02:55:12Z")

</div>

> [@ricardo](#):
>
> `[-d $autre] || echo "Le dossier de montage n'existe pas !"`

Bonjour,  
Plutôt que d’avertir de la non-existence du dossier, je le créerais directement.

```auto
[-d $autre] || mkdir -p $autre
```

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/24 "2016-02-21T02:55:13Z")

</div>

1/ Oui mais ça ne va pas faire une réponse supplémentaire, du genre : “ne peut pas créer,le dossier existe déjà” ?  
2/ J’ai déjà modifié pas mal de choses en fonction des précédentes réponses, que je proposerai après mais j’ai besoin encore d’une aide :  
comment mettre la sortie sur la même ligne ?

`then
	echo "Le dossier de montage n'existe pas !"
	exit`

---

<div class="post-metadata">

**Author:** ![eol](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/e/b782af/32.png) [@eol](https://www.debian-fr.org/u/eol)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/25 "2016-02-21T02:55:13Z")

</div>

> [@ricardo](#):
>
> 1/ Oui mais ça ne va pas faire une réponse supplémentaire, du genre : «&nbsp;ne peut pas créer,le dossier existe déjà&nbsp;»

Non.  
Si le dossier existe, la partie derrière le «&nbsp;||&nbsp;» ( ou ) ne sera jamais éxecutée.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/26 "2016-02-21T02:55:14Z")

</div>

> [@eol](#):
>
> `[-d $autre] || mkdir -p $autre`

Le premier test est inutile, l’option -p suffit.

@ricardo \>

```auto
echo "Le dossier de montage n'existe pas !" && exit
```

Tu devrais quand même lui donner un code d’erreur («&nbsp;exit 1&nbsp;» par exemple).

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/27 "2016-02-21T02:55:15Z")

</div>

```auto
Si je comprends bien, cette commande ne nécessite rien d'autre puisque :
si '$autre' (le dossier de montage) existe, il passe à la suite
si '$autre' n'existe pas, il le crée
problème : pour créer un dossier, il faut être root, alors que va-t-il faire ?
```

Si je comprends bien, cette commande ne nécessite rien d’autre puisque :  
si ‘$autre’ (le dossier de montage) existe, il passe à la suite  
si ‘$autre’ n’existe pas, il le crée  
problème : pour créer un dossier, il faut être root, alors que va-t-il faire ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/28 "2016-02-21T02:55:16Z")

</div>

[quote=“ricardo”]`mkdir -p $autre`  
Si je comprends bien, cette commande ne nécessite rien d’autre puisque :  
si ‘$autre’ (le dossier de montage) existe, il passe à la suite  
si ‘$autre’ n’existe pas, il le crée  
problème : pour créer un dossier, il faut être root, alors que va-t-il faire ?[/quote]  
Te balancer une erreur comme quoi il n’a pas les droits suffisants.

```auto

```

Conseil : protège la variable avec des double guillemets :

```auto

```

Comme ça si autre contient un espace, il créeras un dossier avec un espace dedans et pas deux dossiers.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/29 "2016-02-21T02:55:17Z")

</div>

Et pour l’histoire (au sujet de mon dernier conseil), un patch qui a fait le tour de monde il n’y a pas très longtemps était celui-ci :

[code]- rm -rf /usr /lib/nvidia-current/xorg/xorg

- rm -rf /usr/lib/nvidia-current/xorg/xorg[/code]

Une faute de frappe Tu peut voir le commit ici :  
[github.com/MrMEEE/bumblebee/com … cdbe0acce6](https://github.com/MrMEEE/bumblebee/commit/a047be85247755cdbe0acce6)

L’utilisation d’une variable et la protection par les guillemets permet d’obtenir un message d’erreur plutôt que de détruire la distribution.

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/30 "2016-02-21T02:55:17Z")

</div>

jolie la boulette ! ![:038](https://www.debian-fr.org/uploads/default/original/1X/08df484251490af77ba342c0331f3ee271065fe9.gif "bravo")

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/31 "2016-02-21T02:55:17Z")

</div>

[quote=“MisterFreez”]Et pour l’histoire (au sujet de mon dernier conseil), un patch qui a fait le tour de monde il n’y a pas très longtemps était celui-ci :

[code]- rm -rf /usr /lib/nvidia-current/xorg/xorg

- rm -rf /usr/lib/nvidia-current/xorg/xorg[/code]

Une faute de frappe Tu peut voir le commit ici :  
[github.com/MrMEEE/bumblebee/com … cdbe0acce6](https://github.com/MrMEEE/bumblebee/commit/a047be85247755cdbe0acce6)

L’utilisation d’une variable et la protection par les guillemets permet d’obtenir un message d’erreur plutôt que de détruire la distribution.[/quote]

Mais en fait, qu’est-ce qui empêche de n’utiliser QUE les guillemets ?  
Y-a-t-il des cas ou les '…'soient indispensables ?

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/32 "2016-02-21T02:55:18Z")

</div>

[quote=«&nbsp;MisterFreez&nbsp;»]@ricardo \>

`echo "Le dossier de montage n'existe pas !" && exit`[/quote]  
Oui mais la ligne est plus longue que ça.  
Je voudrais savoir si et comment on peut faire que le ‹&nbsp;&&&nbsp;› ne soit pris en compte que pour ce qui est après le ‹&nbsp;||&nbsp;› et non avant.  
ligne complète :

> [@](#):
>
> [-e «&nbsp;$variable&nbsp;»] || echo «&nbsp;Le dossier de montage n’existe pas !&nbsp;» && exit 1

Autrement dit, si $variable est présent, que ça ne sorte PAS.

---

<div class="post-metadata">

**Author:** ![micky979](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/d9b06d/32.png) [@micky979](https://www.debian-fr.org/u/micky979)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/33 "2016-02-21T02:55:19Z")

</div>

Bonjour,

Cette syntaxe n’executera le exit 1 que si la variable n’existe pas :

```auto

```

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/34 "2016-02-21T02:55:22Z")

</div>

J’y avait pensé mais j’ai testé avec les crochets et je n’ai pas insisté, quelle burne 😒  
Merci.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/35 "2016-02-21T02:55:22Z")

</div>

[quote=«&nbsp;micky979&nbsp;»]Bonjour,

Cette syntaxe n’executera le exit 1 que si la variable n’existe pas :

`[-e "$variable"] || ( echo "Le dossier de montage n'existe pas " && exit 1 )`[/quote]  
Ben non, si la variable n’est pas bonne, il continue sans sortir (copié/collé) :

```auto
[-e "$variable"] || ( echo "Le dossier de montage n'existe pas !" && exit 1 )
```

![:013](https://www.debian-fr.org/uploads/default/original/1X/086709e9e4d48f0fa24e42243bbce857fc2be47f.gif "colere") ![:013](https://www.debian-fr.org/uploads/default/original/1X/086709e9e4d48f0fa24e42243bbce857fc2be47f.gif "colere") ![:013](https://www.debian-fr.org/uploads/default/original/1X/086709e9e4d48f0fa24e42243bbce857fc2be47f.gif "colere")

idem sans code de sortie ou avec 64

---

<div class="post-metadata">

**Author:** ![micky979](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/d9b06d/32.png) [@micky979](https://www.debian-fr.org/u/micky979)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/36 "2016-02-21T02:55:23Z")

</div>

Bonjour,

Je n’y ai pas pensé mais c’est le sous-shell qui va etre quitté avec un exit 1 :

[code][-e “$variable”] || ( echo “Le dossier de montage n’existe pas” && exit 1 )

- ‘[’ -e ‘’ ‘]’
- echo ‘Le dossier de montage n’’'existe pas’  
Le dossier de montage n’existe pas
- exit 1  
~$ echo $?  
echo $?
- echo 1  
1[/code]

Voici une autre syntaxe qui devrait fonctionner en utilisant que les && :

```auto

```

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/37 "2016-02-21T02:55:25Z")

</div>

[quote=«&nbsp;ricardo&nbsp;»]  
Je voudrais savoir si et comment on peut faire que le ‹&nbsp;&&&nbsp;› ne soit pris en compte que pour ce qui est après le ‹&nbsp;||&nbsp;› et non avant.  
ligne complète :

> [@](#):
>
> [-e «&nbsp;$variable&nbsp;»] || echo «&nbsp;Le dossier de montage n’existe pas !&nbsp;» && exit 1

Autrement dit, si $variable est présent, que ça ne sorte PAS.[/quote]

Il faut que tu inclus tes 2 instructions dans un bloc et dans le même contexte. Un bloc se constitue avec des accolades :

```auto
[-e "$variable"] || {
  echo "Le dossier de montage n'existe pas !" 
  exit 1
}
```

si l’accolade de fin se trouve sur une ligne avec instruction, il faut que la dernière instruction soit suivie d’un point-virgule :

```auto
[-e "$variable"] || { echo "Le dossier de montage n'existe pas !"; exit 1; }
```

Les parenthèses peuvent également être utilisées pour créer un bloc. Cependant, elles crées également un processus fils. L’emploi d’un exit dans un processus fils permet de quitter le processus fils et non le processus père. Ce n’est donc pas ce que tu souhaites.  
A l’inverse des accolades, le point-virgule en fin de bloc n’est pas nécessaire.

edit : aussi, il est d’habitude d’envoyer les messages d’erreur sur la sortie…d’erreur !

```auto
[-e "$variable"] || { echo "Le dossier de montage n'existe pas !" >&2; exit 1; }
# ou bien 
[-e "$variable"] || { echo "Le dossier de montage n'existe pas !"; exit 1; } >&2
```

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/38 "2016-02-21T02:55:26Z")

</div>

Merci à vous deux ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut")  
Totor, tu as devancé la question que je voulais poser ensuite avec la façon d’ajouter le retour de code d’erreur ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")  
Mais j’ai encore deux questions sur le domaine des codes.  
1/ quand plusieurs ‹&nbsp;exit&nbsp;› sur un script, doit-on changer le code à chaque ‹&nbsp;exit&nbsp;› ?  
et celui de «&nbsp;fin&nbsp;», comment le rédiger ?

2/ J’ai lu dans le lien qui suit, qu’il serait préférable d’employer les code d’erreur perso entre 64 et 113. Qu’en pensez-vous ?  
[http://abs.traduc.org/abs-fr/apd.html#exitcodesref](http://abs.traduc.org/abs-fr/apd.html#exitcodesref)

EDIT :  
explication de «&nbsp;\>&2&nbsp;»  
Je comprends que ça permet avec un echo $? de connaître le code d’erreur.  
Mais le «&nbsp;plus grand que&nbsp;» «&nbsp;et deux&nbsp;» ???

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/39 "2016-02-21T02:55:27Z")

</div>

Re,

1/ Non, tu n’es pas obligé. Il est bon regrouper ses codes erreur par “type” : technique en rapport avec des accès disques, erreur technique en rapport avec le réseau …etc (mais également fonctionnel) Ensuite, le message est là pour apporter des précisions et orienter l’utilisateur.

Pour celui de fin, il n’est pas nécessaire. S’il n’existe pas, le statut ne vaut pas forcément 0 mais vaut celui de la dernière instruction exécutée (Contrairement à ce que beaucoup de développeurs pensent).

2/ Je ne connaissais pas cette classification et j’avoue que j’ai tendance à utiliser mes propres statuts.

Explication :

- le 2 est le n° du descripteur de fichier (fd) de la sortie d’erreur (dont le fichier associé est /dev/stderr)
- le signe “\>” indique une redirection de flux. Par défaut, on redirige la sortie standard. Mais l’on peut préciser le flux à rediriger  
exemple : 2\>&1 où là on fait l’inverse : on redirige la sortie d’erreur vers la sortie standard (fd de la sortie standard=1).
- le & préciser que l’on redirige vers un fd. Si le & est absent, on redirige vers un fichier…

il existe 3 fd par défaut :  
0 - entrée standard  
1 - sortie standard  
2 - sortie d’erreur

pour plus de précisions : [abs.traduc.org/abs-fr/ch19.html](http://abs.traduc.org/abs-fr/ch19.html)  
(car il y a beaucoup de variantes et c’est quelque peu complexe)

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 2:55 UTC](https://www.debian-fr.org/t/travail-termine-corrections/33195/40 "2016-02-21T02:55:28Z")

</div>

Non, tes explications me suffisent, je n’ai pas l’intention de devenir prof d’info à mon âge 😃 Mais j’aime bien comprendre un minimum ce que je fais.  
Merci.  
Y’en aura certainement d’autres 😉

[Page précédente](https://www.debian-fr.org/t/travail-termine-corrections/33195.md?page=1)

[Page suivante](https://www.debian-fr.org/t/travail-termine-corrections/33195.md?page=3)
