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

hmm


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
man … a écrit :
…
              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