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

une instruction ksh qui me pose pb (mais pourtant basic)

8 réponses
Avatar
at.choum
je voudais faire

[ -f /tmp/toto ] || ( echo "probleme ..." && exit 1 )
echo "no probleme"
exit 0

curieusement, si /tmp/toto n'existe pas le resultat est

probleme ...
no probleme

pour moi c'est probleme. Pourquoi ?

8 réponses

Avatar
Nicolas George
AT.Choum wrote in message
:
[ -f /tmp/toto ] || ( echo "probleme ..." && exit 1 )


Ce qui est entre parenthèses est exécuté dans un sous-shell, et ce
sous-shell qui est concerné par exit. Deux manières de ré-écrire ça :

if [ ! -f /tmp/toto ]; then echo "probleme ..." && exit 1; fi

[ -f /tmp/toto ] || { echo "probleme ..." && exit 1; }

Je ne sais pas si c'est valable pour ksh, mais ça l'est pour sh (qui est son
ancêtre), et zsh (qui est un descendant).

Avatar
Stephane Chazelas
2004-10-27, 08:37(-07), AT.Choum:
je voudais faire

[ -f /tmp/toto ] || ( echo "probleme ..." && exit 1 )
echo "no probleme"
exit 0

curieusement, si /tmp/toto n'existe pas le resultat est

probleme ...
no probleme

pour moi c'est probleme. Pourquoi ?


Les parentheses creent un sous-shell (c'est a ca qu'elle
servent). Donc, tu ne sors que du sous-shell.
Utilise { ...; } pour grouper des commandes.

[ -f /tmp/toto ] || {
echo >&2 "probleme ..."
exit 1
}

if [ ! -f /tmp/toto ]; then
echo >&2 "probleme ..."
exit 1
fi

Note que "-f" ne fait pas que verifier que /tmp/toto, il verifie
aussi que /tmp/toto est un fichier regulier (ou un lien
symbolique vers un fichier regulier). Tu peux avoir un
repertoire /tmp/toto (ou socket/device/pipe/door...) et alors [
-f /tmp/toto ] retournera "false".

pour verifier que /tmp/toto (si on le peut), c'est
if [ -e /tmp/toto ]; then...
(marchera pas forcement pour les liens symboliques vers un
fichier qui n'existe pas ou dont on ne peut pas verifier
l'existence)

ou de maniere plus portable:

if ls -d /tmp/toto > /dev/null 2>&1; then...

(voir l'option -L de ls si on veut verifier que le fichier
pointé par le lien symbolique existe).

--
Stephane

Avatar
FAb
(AT.Choum) writes:

je voudais faire

[ -f /tmp/toto ] || ( echo "probleme ..." && exit 1 )
echo "no probleme"
exit 0



[ -f /tmp/toto ] || ( echo "probleme ..." && exit 1 )

en bash ça passe.

FAb

Avatar
Nicolas George
FAb wrote in message :
[ -f /tmp/toto ] || ( echo "probleme ..." && exit 1 )

en bash ça passe.


Ah ? Moi j'ai :

bash: (: command not found

Ce qui est tout à fait logique : « ( » dit d'exécuter la commande qui
s'appelle (.

Avatar
FAb
Nicolas George <nicolas$ writes:

FAb wrote in message :
[ -f /tmp/toto ] || ( echo "probleme ..." && exit 1 )

en bash ça passe.


Ah ? Moi j'ai :

bash: (: command not found

Ce qui est tout à fait logique : « ( » dit d'exécuter la commande qui
s'appelle (.


Exact.
Bonté divine je suis *persuadé* d'avoir employé ce truc pourtant dans un
script. L'âge peut-être ? l'alcool ?


Au temps pour moi,
FAb


Avatar
at.choum
Nicolas George <nicolas$ wrote in message news:<clofl2$2iab$...
AT.Choum wrote in message
:
[ -f /tmp/toto ] || ( echo "probleme ..." && exit 1 )





[ -f /tmp/toto ] || { echo "probleme ..." && exit 1; }


C'est ok. En fait j'avais deja essaye avec les {} mais j'avais oublié
le ; de la fin et donc j'avais laissé de coté. Curieux quand meme ce
";". Il ne sert pas a grand chose.
(Le && dans mon exemple est plus qu'inutile mais ce n'est qu'un
exemple pour illustrer le op || { op && op; }

Merci a tous.


Avatar
Stephane Chazelas
2004-10-28, 01:25(-07), AT.Choum:
Nicolas George <nicolas$ wrote in message news:<clofl2$2iab$...
AT.Choum wrote in message
:
[ -f /tmp/toto ] || ( echo "probleme ..." && exit 1 )





[ -f /tmp/toto ] || { echo "probleme ..." && exit 1; }


C'est ok. En fait j'avais deja essaye avec les {} mais j'avais oublié
le ; de la fin et donc j'avais laissé de coté. Curieux quand meme ce
";". Il ne sert pas a grand chose.



Si, essaie:

echo exit 1 }
(pas en zsh)

et

echo exit 1 )

Et tu comprendras.

{ et } sont des keywords. Quand ils ne sont pas en debut de
ligne de commande, ils ne sont pas speciaux (sauf pour zsh, et
ils peuvent aussi etre impliqués dans les brace expansion {a,b}
et les variables ${var}). C'est comme pour "if", "then"... (tu
peux ecrire "echo then", ce n'est pas une erreur, heureusement).

--
Stephane



Avatar
at.choum
Stephane Chazelas wrote in message
AT.Choum wrote in message

[ -f /tmp/toto ] || { echo "probleme ..." && exit 1; }


C'est ok. En fait j'avais deja essaye avec les {} mais j'avais oublié
le ; de la fin et donc j'avais laissé de coté. Curieux quand meme ce
";". Il ne sert pas a grand chose.


Si, essaie:
echo exit 1 }
(pas en zsh)
et
echo exit 1 )
Et tu comprendras.


ok compris. Merci.