#1 Le 05/05/2022, à 21:54
- Tawal
[Shell] Test vide entre crochet - Comprendre les résultats
Hello,
Le titre n'est pas très clair, alors autant montrer que raconter :
$ []
$ echo $?
0
$
$ [ ]
$ echo $?
1
$
Je ne saisi pas pourquoi cela fonctionne et encore moins les codes retours.
Dernière modification par Tawal (Le 06/05/2022, à 09:16)
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
#2 Le 05/05/2022, à 22:00
- Vobul
Re : [Shell] Test vide entre crochet - Comprendre les résultats
Alors chez moi (archlinux) avec bash 5.1.16:
[]
bash: []: command not found
[ ]
echo $?
1
Pour t'aider à comprendre :
help [
help test
Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM
Hors ligne
#3 Le 05/05/2022, à 22:23
- Watael
Re : [Shell] Test vide entre crochet - Comprendre les résultats
en gros, pareil avec dash, ksh et zsh : command not found
Dernière modification par Watael (Le 05/05/2022, à 22:24)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 06/05/2022, à 09:15
- Tawal
Re : [Shell] Test vide entre crochet - Comprendre les résultats
En fait, le résultat (et le fonctionnement) de
[]
vient de l'option shell nullglob (activée par défaut dans mon .bashrc)
Sans elle, j'obtiens aussi un command not found.
Et vu qu'on a le même effet sur différents shells, je change, dans le titre, [Bash] par [Shell].
Mais j'ai encore du mal à saisir ...
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
#5 Le 06/05/2022, à 10:08
- iznobe
Re : [Shell] Test vide entre crochet - Comprendre les résultats
Bonjour , si j e comprends bien ca equivaut a faire :
if test " " is true => 0
if test " " is false => 1
dans l ' expression :
[]
le test est invalide , car l' argument est NULL ( je suppose ) .
dans l' expression :
[ ]
, le test est consideré valide , et donc le retour est faux puisque 1 .
le test s ' applique sur les expressions unaires et binaires .
en meme temps il faudrait comprendre ce qu ' il teste pour reellement interpreté correctement ce test .
peut etre que ca serait : est ce que " un espace " est vrai ?
Dernière modification par iznobe (Le 06/05/2022, à 10:08)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#6 Le 06/05/2022, à 12:08
- Watael
Re : [Shell] Test vide entre crochet - Comprendre les résultats
[] n'est même pas "vu" par set -x
c'est vraiment bizarre.
Tawal, tu devrais demander sur la liste de diffusion de bash : help-bash@gnu.org
Dernière modification par Watael (Le 06/05/2022, à 15:02)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 06/05/2022, à 12:25
- Postmortem
Re : [Shell] Test vide entre crochet - Comprendre les résultats
Salut,
Pour « [ ] », je dirais que c'est équivalent à « [ -n "" ] » ; on test si la chaîne de caractère est non vide, d'où le code retour différent de 0.
Pour « [] », avec nullglob activé, « [] » est supprimé avant exécution, c'est un peu comme si on avait tapé juste "Entrée", d'où le code retour 0.
Enfin, je suppose...
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#8 Le 06/05/2022, à 12:44
- Watael
Re : [Shell] Test vide entre crochet - Comprendre les résultats
ce ne semble pas être supprimé avant exécution, car si on le fait précéder d'un false, le code de retour n'est pas 1.
$ set -x; false; []; echo $?; set +x
+ false
+ echo 0
0
+ set +x
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 06/05/2022, à 12:58
- Postmortem
Re : [Shell] Test vide entre crochet - Comprendre les résultats
Si tu fais plutôt un "set -uvx", tu verras qu'il est "supprimé" quand tu tapes juste [] (compare avec et sans nullglob).
Par contre, je mets "supprimé" car c'est chelou en effet le comportement avec false
Edit :
En fait, je pense que le code retour devient 0 car on a tapé une commande, mais qui ne fait rien.
Dernière modification par Postmortem (Le 06/05/2022, à 13:07)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#10 Le 06/05/2022, à 13:02
- MicP
Re : [Shell] Test vide entre crochet - Comprendre les résultats
Bonjour
Extrait du retour de la ligne de commande suivante :
man --pager='less -p "\[ expr ]$"' bash
… test et [ évaluent les conditions en fonction d'un jeu de règles dépendant du nombre d'arguments. 0 argument La condition est fausse. 1 argument La condition est vraie si et seulement si l'argument n'est pas NULL. …
=======
michel@debbull:~$ []; echo $?
bash: [] : commande introuvable
127
michel@debbull:~$
Ci-dessus, j'ai ajouté à la suite du nom de la commande [ un caractère supplémentaire,
mais comme il n'existe aucune commande dont le nom serait []
alors le message d'erreur suivant est retourné par l'interpréteur bash :
bash: [] : commande introuvable
et dans ce cas, le code d'erreur retourné est : 127
=======
michel@debbull:~$ [ ]; echo $?
1
michel@debbull:~$
Ci-dessus, il n'y a qu'un seul caractère espace séparant la commande [ de son caractère de fermeture de commande qui est : ]
il n'y a donc aucun argument donné à la commande [ <=> 0 argument => La condition est fausse
et dans ce cas, le code d'erreur retourné est 1
Dernière modification par MicP (Le 06/05/2022, à 13:50)
Hors ligne
#11 Le 06/05/2022, à 13:56
- LeoMajor
Re : [Shell] Test vide entre crochet - Comprendre les résultats
salut,
[]
le 1er cas est un plutôt un problème de sémantique. Ni commande, ni fichier, ni untel objet. Bref, un problème d'identification.
renvoie à getline, complete, compgen ...
[ ]
problème de syntaxe.
L'objet identifiée est une commande (probablement la commande test), mais elle est invalide, incomplète. Un argument mandataire a été oublié
test
echo $?
1
file -bi
echo $?
1
Hors ligne
#12 Le 06/05/2022, à 15:09
- Postmortem
Re : [Shell] Test vide entre crochet - Comprendre les résultats
Pour moi, dans le cas de « [ ] », la commande est OK et cette commande de test renvoie faux. Si la commande était KO (niveau syntaxe), on aurait un code retour 2.
« [ ] » semble vraiment correspondre à tester "si la chaine vide est non-vide", d'où le code retour 1 :
$ [ a b c ]
bash: [: b : opérateur binaire attendu
$ echo $?
2
$ [ ]
$ echo $?
1
$ [ -n "" ]
$ echo $?
1
Pour « [] » (avec nullglob activé), on dirait que ça exécute une commande mais que cette commande étant "rien", ben on fait rien et du coup, code retour 0.
$ false
$ echo $?
1
$ false; []
[] : commande introuvable
$ echo $?
127
$ shopt -s nullglob
$ false
$ echo $?
1
$ false; []
$ echo $?
0
Edit :
Du coup, pour résumer, « [ ] » est un test, « [] » est un "glob".... Enfin, c'est comme ça que je le comprends !
Dernière modification par Postmortem (Le 06/05/2022, à 15:18)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#13 Le 06/05/2022, à 15:53
- Watael
Re : [Shell] Test vide entre crochet - Comprendre les résultats
oui ! un glob ! comme [abc], par exemple, mais vide.
ne trouvant pas de fichier correspondant à a, b, ou c, il n'y a pas de développement (nullglob obllige), et pas d'erreur en retour.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne