Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

bash: probleme de test dans if

11 réponses
Avatar
Hugolino
Salut,

J'ai encore un problème de test d'existence de fichier quand celui-ci
n'existe pas. (Pas de problème quand le fichier existe)

L'exécution du script raconte ça:

[: 53: /home/hugo/mail/mbox_du_jour: unexpected operator

Les lignes en cause sont:
8<-----------8<---------8<----------8<----------8<----------8<----------8<
16 BOITE_MAIL_SOURCE=~/mail/mbox_du_jour


47 if [ ! -a ${BOITE_MAIL_SOURCE} ]
48 then
49 echo ${RED}" Pas de fichier "${CYAN}${BOITE_MAIL_SOURCE}
50 echo ${GREEN}" (Il n'y a pas eu de courrier reçu récemment)"
51 echo ${NORMAL}
52 exit 1
53 fi
8<-----------8<---------8<----------8<----------8<----------8<----------8<

J'ai essayé avec ou sans accolades, $BOITE_MAIL_SOURCE ou
${BOITE_MAIL_SOURCE} et le problème est le même.

Qu'est-ce que j'ai encore mal fait ?!??

Merci de votre aide.

--
$ rm *>o
$ ls
o
Hugo (né il y a 1 357 307 702 secondes)

10 réponses

1 2
Avatar
Vincent Lefevre
Dans l'article ,
Hugolino écrit:

J'ai encore un problème de test d'existence de fichier quand celui-ci
n'existe pas. (Pas de problème quand le fichier existe)

L'exécution du script raconte ça:

[: 53: /home/hugo/mail/mbox_du_jour: unexpected operator

Les lignes en cause sont:
8<-----------8<---------8<----------8<----------8<----------8<----------8<
16 BOITE_MAIL_SOURCE=~/mail/mbox_du_jour



47 if [ ! -a ${BOITE_MAIL_SOURCE} ]


Le -a, c'est un "and", qui ne peut donc pas suivre un "!" (not).

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
Stephane Chazelas
2007-04-30, 02:47(+00), Vincent Lefevre:
Dans l'article ,
Hugolino écrit:

J'ai encore un problème de test d'existence de fichier quand celui-ci
n'existe pas. (Pas de problème quand le fichier existe)

L'exécution du script raconte ça:

[: 53: /home/hugo/mail/mbox_du_jour: unexpected operator

Les lignes en cause sont:
8<-----------8<---------8<----------8<----------8<----------8<----------8<
16 BOITE_MAIL_SOURCE=~/mail/mbox_du_jour



47 if [ ! -a ${BOITE_MAIL_SOURCE} ]


Le -a, c'est un "and", qui ne peut donc pas suivre un "!" (not).



Oui, quoique quand il n'y a pas ambiguité, c'est aussi un
synonyme de "-e". Autrement dit, il y a deux -a: un unary et un
binary. Seul le binary est standard.

if [ ! -e "$BOITE_MAIL_SOURCE" ]
if ! [ -e "$BOITE_MAIL_SOURCE" ]

if ! ls -d -- "$BOITE_MAIL_SOURCE" > /dev/null
qui est en fait equivalent a
if ! [ -e "$BOITE_MAIL_SOURCE" ] ||
! [ -L "$BOITE_MAIL_SOURCE" ]

[ -e ... ] retournera false si ... est un lien symbolique vers
un fichier qui n'existe pas.

--
Stéphane


Avatar
Vincent Lefevre
Dans l'article ,
Stephane Chazelas écrit:

Oui, quoique quand il n'y a pas ambiguité, c'est aussi un
synonyme de "-e". Autrement dit, il y a deux -a: un unary et un
binary. Seul le binary est standard.


Bizarre, la page man ("man [") n'indique pas la forme unary:

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Avatar
Nicolas George
Vincent Lefevre wrote in message
<20070430110956$:
Bizarre, la page man ("man [") n'indique pas la forme unary:


La page de man de bash ([ est un builtin de bash) en parle.

Avatar
Vincent Lefevre
Dans l'article <4635d125$0$641$,
Nicolas George <nicolas$ écrit:

Vincent Lefevre wrote in message
<20070430110956$:
Bizarre, la page man ("man [") n'indique pas la forme unary:


La page de man de bash ([ est un builtin de bash) en parle.


Effectivement. Mais à noter que le -a unaire n'est pas portable. Et
sous zsh, bien que [ soit builtin, le -a unaire ne fonctionne qu'avec
la construction [[.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Stephane Chazelas
2007-04-30, 11:37(+00), Vincent Lefevre:
Dans l'article <4635d125$0$641$,
Nicolas George <nicolas$ écrit:

Vincent Lefevre wrote in message
<20070430110956$:
Bizarre, la page man ("man [") n'indique pas la forme unary:


La page de man de bash ([ est un builtin de bash) en parle.


Effectivement. Mais à noter que le -a unaire n'est pas portable. Et
sous zsh, bien que [ soit builtin, le -a unaire ne fonctionne qu'avec
la construction [[.


En l'occurrence, je pense qu'il s'agit d'un bug. D'apres la doc
de zsh [ -a file ] devrait marcher.

Ni -e ni -a n'existait dans le Bourne shell. Je pense que [ -a
est apparu en premier dans ksh. Je ne sais pas comment -e est
apparu mais c'est celui qui a ete choisi par POSIX.

-e est pour "exists", c'est un peu misleading dans la mesure ou
un fichier peut exister et ce test renvoyer false. En fait, il
teste si on peut faire un stat(2) (pas lstat(2)) avec success
sur le fichier. D'ou -a...ccessible je suppose.

--
Stéphane



Avatar
Vincent Lefevre
Dans l'article <4635d125$0$641$,
Nicolas George <nicolas$ écrit:

Vincent Lefevre wrote in message
<20070430110956$:
Bizarre, la page man ("man [") n'indique pas la forme unary:


La page de man de bash ([ est un builtin de bash) en parle.


Le -a ne semble pas fonctionner avec [ et ! sous bash:

:~$ touch exists
:~$ [ ! -e exists ] || echo found
found
:~$ [ ! -a exists ] || echo found
:~$

En revanche, on a bien:

:~$ [[ ! -e exists ]] || echo found
found
:~$ [[ ! -a exists ]] || echo found
found
:~$

et

:~$ [ -e exists ] && echo found
found
:~$ [ -a exists ] && echo found
found
:~$

C'est la version 3.1 (paquet Debian bash 3.1dfsg-8). Je viens de faire
un rapport de bug sur le BTS de Debian.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Vincent Lefevre
Dans l'article ,
Stephane Chazelas écrit:

2007-04-30, 11:37(+00), Vincent Lefevre:
Effectivement. Mais à noter que le -a unaire n'est pas portable. Et
sous zsh, bien que [ soit builtin, le -a unaire ne fonctionne qu'avec
la construction [[.


En l'occurrence, je pense qu'il s'agit d'un bug. D'apres la doc
de zsh [ -a file ] devrait marcher.


Je ne pense pas. La page man dit juste:

test [ arg ... ]
[ [ arg ... ] ]
Like the system version of test. Added for compatibility;
use conditional expressions instead (see the section `Condi-
tional Expressions'). The main differences between the con-
ditional expression syntax and the test and [ builtins are:
these commands are not handled syntactically, so for example
an empty variable expansion may cause an argument to be
omitted; syntax errors cause status 2 to be returned instead
of a shell error; and arithmetic operators expect integer
arguments rather than arithemetic expressions.

Note le "Like the system version of test". Je pense que le minimum
auquel on peut s'attendre, c'est que ça fonctionne avec les opérateurs
standard. Sinon, cela ne semble pas spécifié.

Ni -e ni -a n'existait dans le Bourne shell. Je pense que [ -a
est apparu en premier dans ksh. Je ne sais pas comment -e est
apparu mais c'est celui qui a ete choisi par POSIX.


Le -a était peut-être trop ambigu.

-e est pour "exists", c'est un peu misleading dans la mesure ou
un fichier peut exister et ce test renvoyer false. En fait, il
teste si on peut faire un stat(2) (pas lstat(2)) avec success
sur le fichier. D'ou -a...ccessible je suppose.


"accessible" serait un peu misleading aussi (car cela peut faire
référence aux permissions). Je pensais plutôt à -a...ll (all types).

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Stephane Chazelas
2007-04-30, 11:50(+00), Vincent Lefevre:
Dans l'article <4635d125$0$641$,
Nicolas George <nicolas$ écrit:

Vincent Lefevre wrote in message
<20070430110956$:
Bizarre, la page man ("man [") n'indique pas la forme unary:


La page de man de bash ([ est un builtin de bash) en parle.


Le -a ne semble pas fonctionner avec [ et ! sous bash:

:~$ touch exists
:~$ [ ! -e exists ] || echo found
found
:~$ [ ! -a exists ] || echo found
:~$
[...]


Si, il fonctionne comme specifié par POSIX. Pour un nombre
d'arguments (hormis [ et ]) <= 3, c'est entierement specifié.

Ici, on a [ X -a Y ], c'est a dire "X non-vide et Y non vide".

Vu que ni "!" ni "exists" ne sont des chaines vides, le resultat
est true. Ici -a est le binary operator.

[ "" -a exists ]

retourne false.

--
Stéphane



Avatar
Vincent Lefevre
Dans l'article ,
Stephane Chazelas écrit:

Si, il fonctionne comme specifié par POSIX. Pour un nombre
d'arguments (hormis [ et ]) <= 3, c'est entierement specifié.

Ici, on a [ X -a Y ], c'est a dire "X non-vide et Y non vide".

Vu que ni "!" ni "exists" ne sont des chaines vides, le resultat
est true. Ici -a est le binary operator.

[ "" -a exists ]

retourne false.


Ah, OK. La page man de bash est assez mal foutue: le passage sur le
nombre d'arguments devrait être avant celui sur la signification des
opérateurs, puisque la signification réelle des opérateurs dépend du
nombre d'arguments.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

1 2