Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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 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

Dans son message #1, DonutMan75 a écrit :

…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 ! lol

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 ?

Tawal a écrit :

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é wink


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,



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 ?

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 ?

nany a écrit :

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 ? smile


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 ?

FrancisFDZ a écrit :

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 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 ?

Watael a écrit :

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.

Watael a écrit :

je retourne ta question : pourquoi mettre sur plusieurs lignes ce qui peut tenir sur une seule ? smile

Ok, mais alors une seule ligne de moins de quatre-vingt caractères. tongue

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. smile


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 smile
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. tongue

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 smile
Bonne aprem !

Donut

Hors ligne