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
Jacques L'helgoualc'h
Le 08-04-2005, Emmanuel Florac a écrit :
[...]
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)
--
Jacques L'helgoualc'h

Avatar
Khanh-Dang
for i in /toto/titi/*.txt; do perl -pi -e "s/toto/titi/g" $i; done


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

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. Et dans le pire des cas, si tu tiens vraiment à utiliser une
commande externe, autant le faire avec sed ici, qui semble plus
approprié.

Avatar
TiChou
Dans le message <news:slrnd5drmd.vaj.lhh+,
*Jacques L'helgoualc'h* tapota sur f.c.o.unix :

[...]
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.

--
TiChou


Avatar
Nicolas George
Stephane Dupille wrote in message
:
setsid, c'est bien quand on fait soi-même un programme qui est censé
se comporter en daemon. nohup ne sert pas à ça : il sert à lancer
n'importe quelle commande en tache de fond. Par exemple, il m'est déjà
arrivé de lancer des grosses applis de calculs qui tournent une nuit
entière, et qui ne doit pas être interrompu quand je ne suis pas là.
Dans ce cas, la réponse, c'est nohup, pas setsid.


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.

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.

Avatar
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).



Avatar
Jacques L'helgoualc'h
Le 08-04-2005, TiChou a écrit :
Dans le message <news:slrnd5drmd.vaj.lhh+,
*Jacques L'helgoualc'h* tapota sur f.c.o.unix :
[...]

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,


OK.

et ne conserve pas les permissions d'origine du fichier contrairement
à l'option '-i' de perl.


,---- /usr/share/doc/sed/NEWS.gz
[...]
| Sed 4.1.1
|
| * preserve permissions of in-place edited files
|
`----

--
Jacques L'helgoualc'h


Avatar
TiChou
Dans le message <news:slrnd5e0hp.gp.lhh+,
*Jacques L'helgoualc'h* tapota sur f.c.o.unix :

,---- /usr/share/doc/sed/NEWS.gz
[...]
| Sed 4.1.1
|
| * preserve permissions of in-place edited files
|
`----


Ah merci de l'information ! C'est assez récent comme changement et je n'ai
encore aucune de mes machines qui utilisent une version 4.1.x de GNU sed.

--
TiChou

Avatar
TiChou
Dans le message <news:425700a4$0$1244$,
*Khanh-Dang* tapota sur f.c.o.unix :

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.


pegase tmp # ls -li test
228551 -rw-r----- 1 tichou users 7 Apr 9 00:37 test
^^^^^^ ^^^^^
pegase tmp # sed --version
GNU sed version 4.0.9
pegase tmp # sed -i -e 's/a/b/' test
pegase tmp # ls -li test
228550 -rw-r----- 1 root root 7 Apr 9 00:42 test
^^^^ ^^^^

Les permissions ont changé.

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


Les anciennes versions de perl n'avait pas se comportement et j'en étais
resté là.

Ca me semblerait quand même assez risqué qu'un programme manipule un
fichier réellement sur place.


Non, ça peut être utile quand on a besoin de manipuler des fichiers déjà
ouvert, par exemple des fichiers de log.

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).


C'est pourquoi il est utile de conserver une copie du fichier que l'on
modifie en donnant comme paramètre à l'option '-i' un suffxe :

$ perl -i~ -p -e 's///' fichier

--
TiChou




Avatar
Jacques L'helgoualc'h
Le 08-04-2005, TiChou a écrit :
Dans le message <news:slrnd5e0hp.gp.lhh+,
*Jacques L'helgoualc'h* tapota sur f.c.o.unix :
Sed 4.1.1
* preserve permissions of in-place edited files


Ah merci de l'information !


merci d'avoir attiré mon attention là-dessus ... j'ai quelques
permissions à rectifier.

C'est assez récent comme changement et je n'ai encore aucune de mes
machines qui utilisent une version 4.1.x de GNU sed.


La version 4.1.1 date du 30.6.2004, et la 4.1.4 du 28.1.2005 ;
évidemment, la debian stable est un peu à la traîne :/
--
Jacques L'helgoualc'h


Avatar
Jacques L'helgoualc'h
Le 08-04-2005, TiChou a écrit :
Dans le message <news:425700a4$0$1244$,
*Khanh-Dang* tapota sur f.c.o.unix :
[...]

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.


pegase tmp # ls -li test
228551 -rw-r----- 1 tichou users 7 Apr 9 00:37 test
^^^^^^ ^^^^^
pegase tmp # sed --version
GNU sed version 4.0.9
pegase tmp # sed -i -e 's/a/b/' test
pegase tmp # ls -li test
228550 -rw-r----- 1 root root 7 Apr 9 00:42 test
^^^^ ^^^^

Les permissions ont changé.


Plutôt le propriétaire, en fait ; là aussi, une mise à jour peut être utile.

,----
| Sed 4.1
| [...]
| * -i option tries to set the owner and group to the same as the input file
`----
--
Jacques L'helgoualc'h


2 3 4 5 6