IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Retrouver la sortie d'un script à l'intérieur du script


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut Retrouver la sortie d'un script à l'intérieur du script
    Bonjour,

    est il possible, dans le script lui meme ,de retrouver le nom du fichier ou est redirigé la sortie ?
    ici toto.txt

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Peut-être que c'est possible en inspectant les process ou les file descriptors ouverts... mais je ne connais pas la commande magique...

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 79
    Points : 170
    Points
    170
    Par défaut
    Salut,

    Bon, ce que je vais dire est un peu hors-sujet, mais peut-être que ca correspond plus à ton besoin:

    Au début de ton script, tu peux mettre par exemple:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/bash
    FICHIER=$1
    exec > $FICHIER
    # la suite de ton code...

    Du coup ca résoud le problème. Par contre, il faudra appeler ton script avec un argument (./script.sh toto.txt)

    Désolé si je suis complètement à côté de la plaque. Sinon, je ne vois pas mieux que jack-ft...

  4. #4
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    Mon envie est d'envoyer un mail dans un script pour dire d'aller regarder des trucs dans la log que je cherche a preciser.

    Mon probleme c'est que je n'ai pas la main sur l'appelant et que c'est en amont que la sortie est redirigée.

    Et puis ca serait sympa d'avoir un truc générique pour savoir ou ca a ecrit ...

    Si ,pour suivre l'idée de Jack ,quelqu'un a une idée pour trouver les fichiers associés aux descipteurs d'un process ...

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 79
    Points : 170
    Points
    170
    Par défaut
    Donc faute de mieux, je ferai ca à l'intérieur du script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FICHIER=`readlink /proc/$$/fd/1`
    Edit: Qqs explications (j'ai posté un peu vite tout à l'heure):
    $$ sera remplacé par le PID du script en cours, et on peut consulter ses File Descriptors dans /proc/no_pid/fd/ où on retrouve les standards (0, 1 et 2) qui sont des liens symboliques vers les devices correspondants ou vers les fichiers s'il y a une redirection.
    Readlink permet d'afficher le fichier pointé par le lien.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Je savais bien qu'il y avait une commande magique pour ça!

    Mais que rend-elle si la sortie est un pipe vers un autre process et non un fichier?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    script.sh | egrep -v '^$' > toto.txt

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Bonjour,

    On doit pouvoir aussi passer par lsof comme par exemple quelque chose comme ça (pas tester car pas d'unix ou linux sous la main):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lsof -c script.sh -a -d 1
    Cordialement.
    Cordialement.

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 79
    Points : 170
    Points
    170
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Je savais bien qu'il y avait une commande magique pour ça!

    Mais que rend-elle si la sortie est un pipe vers un autre process et non un fichier?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    script.sh | egrep -v '^$' > toto.txt
    Ah bonne question... je pensais que ca donnerait un lien vers le stdin de l'autre process mais non. Ca donne ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ls -l /proc/30365/fd/
    lrwx------ 1 apaul apaul 64 11 mars  08:40 0 -> /dev/pts/14
    l-wx------ 1 apaul apaul 64 11 mars  08:39 1 -> pipe:[292224859]
    lrwx------ 1 apaul apaul 64 11 mars  08:40 2 -> /dev/pts/14
    Le process du grep a le même pipe en fd0, par contre je ne sais pas comment les mettre en relation facilement (à part passer par lsof)...

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Voici une façon de faire avec lsof:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TOTO=`echo $(lsof -c '^lsof' -g$$ -a -F n -d 1 | sed '/^n\//!d;s/^n//g')`
    echo $TOTO
    Celle ci fonctionne aussi pour les cas suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    script.sh
    script.sh >res.txt
    script.sh | cat
    script.sh | cat >res.txt
    Cordialement.
    Cordialement.

  10. #10
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    Merci, ca marche !

    Juste une petite question de plus ( meme si on me dira que ce n'est pas l'endroit pour ... ) :
    Y a t il l'equivalent sous unix ? ( celui que j'ai sous la main ne connait de readlink que la fonction C readlink )

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Bonjour,

    Tu peux peut-être t'inspirer d'une des idées que j'ai donné dans un autre post:
    http://www.developpez.net/forums/d13...l/#post7176038

    Mais comme je le précise, c'est loin d'être conventionnel.

    Cordialement.
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/05/2014, 14h49
  2. [Greasemonkey] Modifier juste une ligne à l'intérieur de SCRIPT
    Par jeroman dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/12/2010, 12h47
  3. Réponses: 5
    Dernier message: 16/03/2007, 12h16
  4. comment exécuter un bash script à l'intérieur de ma classe java?
    Par moradbe dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 04/03/2007, 04h37
  5. Réponses: 4
    Dernier message: 01/09/2006, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo