Forum Programmation.shell Crontab et sous-shell ?

Posté par  .
Étiquettes : aucune
0
12
oct.
2005
Bonjour,

est-il possible dans une ligne de crontab d'enchainer plusieurs commandes sachant que des variables initialisées dans les premieres commandes sont utilisées par les suivantes:

shell1
#/bin/sh
chaine=chemin/que/je/veux
export chaine

shell2
#/bin/sh
echo "Resultat: $chaine"

crontab
*/2 * * * * (shell1; shell2 >/tmp/verdict)
# le > correspond au sigle "superieur"

Le contenu du fichier verdict donne:
Resultat:

Et je devrais avoir (le resultat que je souhaite ;) ):
Resultat: chemin/que/je/veux

C'est un exemple simplifié, mais il decrit mon besoin.

Merci
  • # Sans même parler de crontab...

    Posté par  . Évalué à 2.

    ..., tes deux scripts s'exécutent dans des environnement indépendants, des nouveaux processus /bin/sh, donc ce que l'un exporte n'affecte pas l'environnement du shell qui l'appelle, et est oublié avant que l'autre ne soit exécuté. Tu peux le vérifier en faisant "shell1 ; shell2" sur ta ligne de commande d'ailleurs.

    Si tu ne peux pas fusionner ces scripts (genre faire en sorte que shell2 soit plutôt appelé depuis shell1), alors il faut trouver autre chose qu'une variable d'environnement pour qu'ils communiquent. Genre un fichier temporaire, ou bien des E/S standard avec un pipe entre les deux. Ou bien alors il faut te débrouiller pour que la variable arrive dans l'environnement du shell qui est leur parent à tous les deux, dans ce genre là :

    --- shell1:
    #!/bin/sh
    chaine=chemin/que/je/veux
    echo "export chaine='${chaine}'"

    --- Utilisation:
    eval $(shell1) ; shell2
  • # Exécuter dans le shell courant

    Posté par  . Évalué à 4.

    Avec la syntaxe (shell1; shell2), un nouveau shell est lancé pour chaque script, les modifications d'environnement ne donc sont pas visibles dans shell2.
    Une solution consiste à faire exécuter shell1 et shell2 sans lancement de sous-shell. Pour cela, l'opérateur est . (le point)
    Tu devrais obtenir ce que tu veux en faisant:
    (. shell1 ; . shell2 > /tmp/verdict)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.