OVH Cloud OVH Cloud

Question sur le shell

52 réponses
Avatar
Grosdebutant
Bonjour,
Je débute en venant de DOS et je comprends pas bien comment dans un shell
positionner une variable pour qu'elle soit valide en sortie du shell
exemple
#!/bin/sh
TOTO=123
echo $TOTO

j'ai bien 123
mais si je lance manuellement echo $TOTO , je n'ai plus rien

Une autre question , est ce qu'il est possible de lancer un executable en
tache de fond a partir d'un shell
#!/bin/sh
Monexe1
Monexe2
Monexe3

en fait je veux lancer un executable (Monexe2)qui ne s'arrête que 10
minutes plus tard. mais je veux que le shell sorte directement.

10 réponses

2 3 4 5 6
Avatar
Emmanuel Florac
Le Fri, 08 Apr 2005 20:47:45 +0000, Laurent Wacrenier a écrit :


C'est par vice, alors.


Non, c'était un exemple vite fait mal fait :)

--
L'Algérie était au bord du gouffre, aujourd'hui elle a fait un grand pas
en avant.
Kaid Ahmed.

Avatar
Emmanuel Florac
Le Fri, 08 Apr 2005 20:51:25 +0000, Jacques L'helgoualc'h a écrit :


Là, tu lances un perl par fichier ...

sed -i -e 's/toto/titi/g' /toto/titi/*.txt



Et là tu lances un sed par fichier, quelle différence?

--
L'esprit qu'on veut avoir gâte celui qu'on a.
Jean-Baptiste Louis Grisset.

Avatar
Nicolas Chuche
Emmanuel Florac disait le 04/09/05 que :

Et là tu lances un sed par fichier, quelle différence?


Euh non.

Ceci dit on peut faire pareil en perl

perl -pi -e 's/toto/titi/g' /toto/titi/*.txt

Et on peut même prévoir une copie de sauvegarde :

perl -pi.bkp -e 's/toto/titi/g' /toto/titi/*.txt

Avatar
Emmanuel Florac
Le Fri, 08 Apr 2005 22:54:50 +0200, Khanh-Dang a écrit :


Là, c'est quand même de l'abus total d'écrire ça.



C'est un exemple.

Il est plus important de mettre des guillemets autour de $i que de
s/toto/titi/g. Et puis un shell peut parfaitement remplir le rôle de Perl
ici.


Heu, oui et non. Et on peut mettre beaucoup de choses dans un uneligne.

Et dans le pire des cas, si tu tiens vraiment à utiliser une
commande externe, autant le faire avec sed ici, qui semble plus
approprié.


Et en quoi sed est-il plus approprié? Je n'utilise quasiment plus jamais
sed et awk puisque j'ai perl qui est plus puissant et souvent plus
efficace.

--
Mais monsieur, voudriez-vous que je me l'écorchasse?
Barbey d'Aurevilly.

Avatar
Jacques L'helgoualc'h
Le 09-04-2005, Emmanuel Florac a écrit :
Le Fri, 08 Apr 2005 20:51:25 +0000, Jacques L'helgoualc'h a écrit :

Là, tu lances un perl par fichier ...

sed -i -e 's/toto/titi/g' /toto/titi/*.txt


Et là tu lances un sed par fichier, quelle différence?


Heu, non, je ne crois pas ; et quand bien même,

- c'est plus court à taper ;

- sed s'initialise plus vite,

- et tient plus facilement dans le cache du processeur :P

Bon, d'accord, s'il y a des calculs à faire ...
--
Jacques L'helgoualc'h


Avatar
Emmanuel Florac
Le Sat, 09 Apr 2005 09:49:42 +0000, Jacques L'helgoualc'h a écrit :


Heu, non, je ne crois pas


Tu as raison...

--
Sutor ne ultra Crepidam.

Avatar
Stephane Chazelas
2005-04-07, 17:18(+02), Paul Gaborit:

À (at) Thu, 07 Apr 2005 15:38:57 +0200,
"Rakotomandimby (R12y) Mihamina" écrivait (wrote):
Si c'est à partir d'un xterm, si tu quitte le xterm, la commande lancée
en background s'aretera. Ce n'est pas systématique, c'est comme ça sous
certaines conditions, que je n'ai pas le temps de reproduire, mais le '&'
en fin de ligne de commande n'est pas éfficace "tout le temps".


Ce comportement n'est pas dépendant du terminal mais du shell.

Certains shells (en gros ceux de la famille 'sh') nécessitent le passage par
'nohup' (car à leur mort ils envoient un signal HUP à tous leurs
fils).


Pas forcement, ca va dependre de si ils sont des controlleurs de
terminal ou pas ou de comment ils meurent (signal, signal non
trappable ou exit normal) et de si les jobs sont en background
ou en foreground. Des background jobs peuvent meme se prendre
des HUP tous seuls si le shell est un controlleur de terminal et
s'ils sont suspendus..

D'autres (en gros ceux de la famille 'csh') gèrent le 'nohup' tout seul en
interne et, à leur mort, détachent les jobs en cours (les éventuelles sorties
de ces jobs sont alors redirigées vers /dev/null).


Qu'est-ce que tu entends par "gerent le nohup tout seul en
interne". Ils ne font tout simplement rien (ne font pas leur
boulot de job control correctement), ils ne detachent rien du
tout. Les sorties ne sont pas redirigees, si csh etait un
controlleur de terminal, alors ces jobs deviennent orphelin et
leur read/write renvoient des EIO s'il essaient d'acceder au
terminal, mais ca n'a rien a voir avec le shell.

D'autres enfin (au moins 'zsh' si mes souvenirs sont bons) permettent de
choisir le comportement voulu...


Oui, voir l'option "HUP" (on par defaut).

tcsh a la commande interne "hup" qui dit que cette commande
devra se prendre un SIGHUP si le shell se termine.

--
Stéphane


Avatar
Stephane Chazelas
2005-04-9, 00:07(+02), Khanh-Dang:
for i in /toto/titi/*.txt; do perl -pi -e "s/toto/titi/g" $i; done


Là, tu lances un perl par fichier ...

sed -i -e 's/toto/titi/g' /toto/titi/*.txt

(Gnu sed v.4)


Qui ne fait pas la même chose que perl. En effet, l'option '-i' du GNU sed
crée un nouveau fichier, donc changement d'inode, et ne conserve pas les
permissions d'origine du fichier contrairement à l'option '-i' de perl.


Chez moi, avec GNU sed 4.0.9, l'option -i crée bien un nouvel inode. En
revanche, les permissions d'origine sont conservés.

Et mon perl 5.8.5 se comporte de la même manière, à savoir changement
d'inode et conservation des permissions.

Ca me semblerait quand même assez risqué qu'un programme manipule un
fichier réellement sur place. Que se passerait-il si on interrompt le
processus en plein milieu. Il est quand même bon que ce genre
d'opérations soient fait de manière atomique (soit tout est fait, soit
rien n'est fait).


perl et sed avec "-i" perdent les fichiers en cas de probleme
anyway. Ils font (au moins perl) l'equivalent de:

(
rm fichier
umask 066
exec > fichier
chmod ... fichier
cmd
) < fichier

Vaut mieux utiliser:

perl -pi.bak ... fichier && rm fichier.bak

Reutiliser le meme inode n'implique pas forcement que ce soit
moins sure, c'est juste qu'on aura plus d'ennuis avec les
permissions.

set -C
cat fichier > fichier.back && set +C &&
cmd < fichier.back > fichier

est a peu pres sur et conserve l'inode de fichier.

--
Stéphane




Avatar
Stephane Chazelas
2005-04-8, 21:42(+00), Nicolas George:
[...]
C'est dans les BSD aussi, mais c'est une fonction de la libc, pas
une commande. Ce n'est pas le même usage.


Sous Linux, il existe une *commande* setsid, qui fait précisément cet appel
système avant d'exécuter la suite.


On peut aussi utiliser perl:

perl -MPOSIX -e 'exit if fork; setsid; exec "cmd", "arg"
' > nohup.out 2>&1 < /dev/null

--
Stéphane


Avatar
Stephane Dupille

Hello Nicolas,

Je recommence. Pour détacher un processus d'un terminal, la bonne méthode
est de le changer de session, pas d'ignorer les SIGHUP. nohup ignore fait en
sorte qu'il ignore les SIGHUP, et ne touche pas à la session. Ergo nohup ne
fait pas The Right Thing.


Oui, on est d'accord là dessus, mais...

Sous Linux, il existe une *commande* setsid, qui fait précisément cet appel
système avant d'exécuter la suite.


C'est bien ce qu'il me semblait : linux n'est pas The Right Thing.
[gimli] ~> uname -s
FreeBSD
[gimli] ~> which setsid
setsid not found

Au moins, nohup est portable... D'ailleurs, je me demande si disown
dans zsh ne fait pas un setsid plutôt qu'un masque des signaux.

--
Voilà voilà. Je n'espère pas vous avoir éclairé (j'ai trop d'habitude
des news pour ignorer le fait que la plupart des gens sont réfractaires
à l'information) mais j'aime bien relire ma prose.
-+- TP in GNU : Il n'est pas nécéssaire d'espérer pour entreprendre -+-

2 3 4 5 6