bash: probleme de test dans if

Le
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)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Vincent Lefevre
Le #734403
Dans l'article Hugolino
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 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Stephane Chazelas
Le #734402
2007-04-30, 02:47(+00), Vincent Lefevre:
Dans l'article Hugolino
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


Vincent Lefevre
Le #734401
Dans l'article Stephane Chazelas
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 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Nicolas George
Le #734400
Vincent Lefevre wrote in message
Bizarre, la page man ("man [") n'indique pas la forme unary:


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

Vincent Lefevre
Le #734399
Dans l'article Nicolas George
Vincent Lefevre wrote in message
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 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Stephane Chazelas
Le #734398
2007-04-30, 11:37(+00), Vincent Lefevre:
Dans l'article Nicolas George
Vincent Lefevre wrote in message
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



Vincent Lefevre
Le #734397
Dans l'article Nicolas George
Vincent Lefevre wrote in message
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 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Vincent Lefevre
Le #734396
Dans l'article Stephane Chazelas
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 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Stephane Chazelas
Le #734395
2007-04-30, 11:50(+00), Vincent Lefevre:
Dans l'article Nicolas George
Vincent Lefevre wrote in message
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



Vincent Lefevre
Le #734394
Dans l'article Stephane Chazelas
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 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Publicité
Poster une réponse
Anonyme