#1 Le 05/09/2022, à 07:15
- DonutMan75
Bash : bloc de commande dans un test ?
Bonjour à tous,
je souhaite tester l'existence d'un répertoire.
Si celui-ci existe, on affiche un message et on quitte.
Sinon on affiche OK.
Voici ma ligne :
[ -d $outdir ] && ( echo "Output directory $outdir already exists. Process aborted" ; exit 1 ) || echo "OK"
Voici ce que j'obtiens à l'exécution :
Cas 1 : le répertoire $outdir n'existe pas
$ ./ma_synchro.sh
OK
$ echo $?
0
Tout se passe comme je l'attendais.
Cas 2 : le répertoire $outdir existe
$ ./ma_synchro.sh
Output directory ./toto/ already exists. Process aborted
OK
$ echo $?
0
Ici il ne devrait pas afficher OK et le code de sortie devrait être 1 (et non pas 0).
Est-ce que le exit() s'applique au bloc entre parenthèse ?
Comment pourrais-je contourner ce problème selon vous ?
Merci par avance
Donut
Hors ligne
#2 Le 05/09/2022, à 07:21
- iznobe
Re : Bash : bloc de commande dans un test ?
[ -d $outdir ] && echo 'Output directory "$outdir" already exists. Process aborted' || echo "OK"
Bonjour et si tu ecris ca , ca donne quoi ?
Dernière modification par iznobe (Le 05/09/2022, à 07:21)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#3 Le 05/09/2022, à 07:31
- FrancisFDZ
Re : Bash : bloc de commande dans un test ?
Bonjour,
@iznobe : Je vois que tu ne donnes pas explicitement le code de sortie, c'est voulu ?
Pour ma part, je pense que le problème pourrait venir de la portée du "&&" et de "||"
Dernière modification par FrancisFDZ (Le 05/09/2022, à 07:35)
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#4 Le 05/09/2022, à 07:40
- MicP
Re : Bash : bloc de commande dans un test ?
Bonjour
…le code de sortie devrait être 1 (et non pas 0). …
L'exécution de la commande echo "OK" s'est déroulée sans provoquer d'erreur, donc le code d'erreur est égal à zéro
Hors ligne
#5 Le 05/09/2022, à 07:44
- vercoucas
Re : Bash : bloc de commande dans un test ?
Bonjour,
A la fin de
( echo "Output directory $outdir already exists. Process aborted" ; exit 1 )
tu mets la valeur du paramètre à 1 regarde si c'est ce qui fait que la commande suivante précédée par || s'exécute
Dernière modification par vercoucas (Le 05/09/2022, à 07:48)
Hors ligne
#6 Le 05/09/2022, à 07:56
- Watael
Re : Bash : bloc de commande dans un test ?
eh, oui. parce que exit 1 sort du sous-shell, pas du script !
test -d "$outdir" && { echo "Output directory \"$outdir\" already exists. Process aborted" ; exit 1;} || echo "OK"
avec des accolades, et des guillemets ce sera mieux.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 05/09/2022, à 08:03
- Tawal
Re : Bash : bloc de commande dans un test ?
Pour garder la même saveur que le demandant :
[ -d "$outdir" ] && { echo "Output directory $outdir already exists. Process aborted" ; exit 1; } || echo "OK"
Le bloc de commande encadré par des parenthèses est exécuté dans un sous-shell, donc le exit1 fait quitter ce sous-shell uniquement. Le code retour de ce bloc de commande est le code retour de la dernière commande exécutée par ce bloc.
Le bloc de commande encadré par des accolades est exécuté dans le shell courant et donc le exit 1 fait quitter le shell en cours.
Il aurait été plus simple d'écrire une syntaxe if...else...fi complète, cela aurait évité une erreur de compréhension :
if [ -d "$outdir" ]
then
echo "Output directory $outdir already exists. Process aborted"
exit 1
else
echo "OK"
fi
Edit: Messages croisés avec Watael.
Dernière modification par Tawal (Le 05/09/2022, à 08:11)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#8 Le 05/09/2022, à 08:09
- lynn
Re : Bash : bloc de commande dans un test ?
if [-d "$outdir" ]
Il manque une espace avant le -d
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#9 Le 05/09/2022, à 08:12
- Tawal
Re : Bash : bloc de commande dans un test ?
Merci @Micp et @lynn
C'est corrigé
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#10 Le 05/09/2022, à 08:16
- nany
Re : Bash : bloc de commande dans un test ?
Bonjour,
Il aurait été plus simple d'écrire une syntaxe if...else...fi complète, cela aurait évité une erreur de compréhension
+1
Pourquoi vouloir faire du one-line dans un script ?
Hors ligne
#11 Le 05/09/2022, à 08:16
- lynn
Re : Bash : bloc de commande dans un test ?
Il ne faudrait pas faire un test sur l'initialisation ou non de la variable $outdir..?
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#12 Le 05/09/2022, à 08:32
- Watael
Re : Bash : bloc de commande dans un test ?
Bonjour,
Tawal a écrit :Il aurait été plus simple d'écrire une syntaxe if...else...fi complète, cela aurait évité une erreur de compréhension
+1
Pourquoi vouloir faire du one-line dans un script ?
parce que, pour des conditions très simples, la structure if...else...fi est visuellement lourde.
je retourne ta question : pourquoi mettre sur plusieurs lignes ce qui peut tenir sur une seule ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 05/09/2022, à 08:56
- iznobe
Re : Bash : bloc de commande dans un test ?
Bonjour,
@iznobe : Je vois que tu ne donnes pas explicitement le code de sortie, c'est voulu ?
Pour ma part, je pense que le problème pourrait venir de la portée du "&&" et de "||"
j' ai testé cela marche , mais je ne sais pas si le resultat attendu est bon :
pi@raspberrypi:~ $ ls
Arduino Desktop echo file libttspico-utils_1.0+git20130326-9_armhf.deb Pictures rpi-clone TEST verif_apache.html
audiodump.wav Documents essai.txt helloworld.wav Mail projets_auto stock_log_files testeur Videos
'^C' Downloads exit libttspico0_1.0+git20130326-9_armhf.deb Music Public Templates tt.sh
pi@raspberrypi:~ $ outdir="Desktop"
pi@raspberrypi:~ $ [ -d $outdir ] && echo 'Output directory "$outdir" already exists. Process aborted' || echo "OK"
Output directory "$outdir" already exists. Process aborted
pi@raspberrypi:~ $ outdir="redirtest"
pi@raspberrypi:~ $ [ -d $outdir ] && echo 'Output directory "$outdir" already exists. Process aborted' || echo "OK"
OK
pi@raspberrypi:~ $
Dernière modification par iznobe (Le 05/09/2022, à 08:58)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#14 Le 05/09/2022, à 09:33
- Tawal
Re : Bash : bloc de commande dans un test ?
Je crois bien que l'effet voulu est : si le dossier existe déjà, on quitte le script sinon on dit que c'est bon et on continue.
Or avec ton code iznobe, on ne sort pas du script en cas de d'existence du dossier.
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#15 Le 05/09/2022, à 10:43
- nany
Re : Bash : bloc de commande dans un test ?
parce que, pour des conditions très simples, la structure if...else...fi est visuellement lourde.
On peut voir ça comme ça, mais personnellement je ne trouve pas la structure (bien indentée) lourde.
je retourne ta question : pourquoi mettre sur plusieurs lignes ce qui peut tenir sur une seule ?
Ok, mais alors une seule ligne de moins de quatre-vingt caractères.
Hors ligne
#16 Le 05/09/2022, à 10:50
- Watael
Re : Bash : bloc de commande dans un test ?
un kilo de plume est visuellement plus lourd qu'un kilo de plomb.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#17 Le 05/09/2022, à 11:06
- Hizoka
Re : Bash : bloc de commande dans un test ?
@Watael, à partir de combien de commande sur une même ligne considères tu qu'il faut changer de ligne ?
Car dans l'idée, un script de 100 lignes peut être mis sur une seule, ça sera du plomb mais illisible...
Comme ça se fait pour du javascript : https://www.toptal.com/developers/javascript-minifier
C'est plus léger (et donc plus rapide à charger) mais incompréhensible.
Je suis pro @nany sur le sujet
Vive l'indentation !
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#18 Le 05/09/2022, à 11:15
- Tawal
Re : Bash : bloc de commande dans un test ?
Watael l'a dit : pour des conditions simples.
En effet, je préfère :
[ "$log" ] && exec 1> >(tee -a "$log")
à
if [ "$log" ]
then
exec 1> >(tee -a "$log")
fi
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#19 Le 05/09/2022, à 11:20
- Watael
Re : Bash : bloc de commande dans un test ?
comme l'a dit nany, une ligne de script ne devrait pas faire plus de 80 caractères.
Ici, on parle d'un test simple. Je ne tiens pas à ne rien indenter, et je peux même indenter un test simple si la ligne est trop longue :
testCommande ... \
&& commande très longue qui ne peut pas échouer \
|| alternative
pour que je fasse un if..else...fi, il faut qu'il y ait plusieurs commandes, et qu'elles puissent échouer :
if testCommande ...
then
commande
commande
commande qui peut échouer
else
commande
commande
fi
mais je ne ferai pas
if testCommande ...
then
commande qui ne peut pas échouer
else
commande
fi
vous voyez la lourdeur du truc ?
sinon, ouvrez les yeux.
Dernière modification par Watael (Le 05/09/2022, à 14:11)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#20 Le 05/09/2022, à 12:51
- DonutMan75
Re : Bash : bloc de commande dans un test ?
Hello,
super merci à tous pour vos retours éclairants !
Je mets à jour mon script
Bonne aprem !
Donut
Hors ligne