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 :

Différent appel d'un script


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Ingénieur intégration
    Inscrit en
    Août 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Août 2007
    Messages : 147
    Par défaut Différent appel d'un script
    Bonjour,

    J'ai un script test.sh qui avait un mauvais chemin pour le shell :
    au lieu de la commande which m'a permis de remédier à ce problème!

    Mais!!! avec ce mauvais chemin, mon script ne fonctionnait pas si je l'appelais de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/local/sbin/test.sh
    , logique! mais fonctionnait avec celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    . /usr/local/sbin/test.sh
    Pardonnez ma question de débutant, mais pourquoi la deuxième manière fonctionnait? Quelqu'un pourrait-il m'en donner l'explication??
    Merci et bonne journée

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    c'est pas fait pour lancer un script la forme

    mais pour charger son contenu
    le fait que si c'est un script il s'execute est "accessoire"

    mais ducoup puisqu'on charge le contenu toute ligne valide est chargée... donc le contenu du script fonctionne (les commandes)

    mais le ksh n'est pas lancé en début de script et ce dernier n'est donc pas executé en tant que script. (avec un shell ouvert spécifiquement pour lui)

    par exemple la forme de charge
    est sencé ne contenir que des variables mais rien n'empêche de lui faire lancer des commandes ....


    pour résumer la différence c'est que tu exécutes des commandes dans un environnement connu et fixé avec shell quand l'entête est présente.
    ou que tu les exécutes dans l'environnement tel qu'il est à un instant T avec toutes les consequences que tu peux immaginer.... si tu n'as pas l'entête correct


    bref le fait que ton script fonctionne dans TON environnement malgré l'erreur est un coup de bol parce que le script est probablement simple et ne touche pas à des éléments trop dispersés ni citriques du système...ni ne fait appel à trop de fonctions et variables existantes.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    je trouve pour le moins surprenant de mettre un script de test dans le répertoire "/usr/local/sbin"!
    Il me semble que ce répertoire est réservé aux développeurs qui maîtrisent particulièrement bien unix... et, je ne sais pas pourquoi, mais j'ai des doutes...
    Peux-tu nous dire pourquoi tu as mis ton script dans ce répertoire?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Par défaut
    Citation Envoyé par nymus7 Voir le message
    Quelqu'un pourrait-il m'en donner l'explication??
    C'est la différence entre exécuter et sourcer.

    Lorsqu'un script est exécuté par la commande le_script, le mécanisme interne de tous les unix consiste à regarder si la 1ère ligne contient un shebang (cf. wikipedia). Si c'est le cas, unix forke le process vers la commande désignée par ce shebang.
    Si cette commande n'existe pas, il se produit une erreur, sinon il continue avec le reste du script passé à cette commande.

    Lorsqu'un script est sourcé depuis un script ou depuis le shell du terminal, par . le_script, la ligne de shebang, si elle existe, est purement et simplement ignorée, comme n'importe quelle ligne de commentaire. Les instructions du script sont interprétées par le script ou le shell qui le source.

    Pour bien voir la différence, tu peux faire l'essai suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    cat > ./petit_test.sh <<EOF
    #!/bin/sh
    ma_variable=oui
    echo "ici ma_variable vaut '\${ma_variable}'"
    EOF
     
    chmod +x ./petit_test.sh
    unset ma_variable
    echo "ma_variable ne vaut rien: '${ma_variable}'"
    ./petit_test.sh
    echo "ma_variable ne vaut toujours rien: '${ma_variable}'"
    . ./petit_test.sh
    echo "et maintenant ma_variable vaut '${ma_variable}'"

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    excellent message.

    La différence entre sourcer ou exécuter entre sh et bash est ténue. Mais avec un fichier sed. C'est flagrant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    $ cat menudate.sed
    #!/bin/sed -nf
     
    /^<item>/,/<\/item>/{
     
            /^<title>/{
                    s@<title>@@
                    s@</title>@@
                    h
            }
     
            /^<guid >/{
                    s@<guid >@@
                    s@</guid>@@
                    H
            }
     
            /pubDate/{
                    s@<pubDate>@@
                    #s@.....@@
                    s@</pubDate>@@
                    #s@^\(......\).*@\1@
     
                    H
                    g
                    s/\(.*\)\n\(.*\)\n\(.*\)/\3\t\1\n\2/
                    p
            }
     
    }
    $ . menudate.sed
    bash: item: Aucun fichier ou dossier de ce type
    bash: title: Aucun fichier ou dossier de ce type
    bash: title: Aucun fichier ou dossier de ce type
    bash: /title: Aucun fichier ou dossier de ce type
    bash: h : commande introuvable
    bash: menudate.sed: line 9: Erreur de syntaxe près du symbole inattendu « } »
    bash: menudate.sed: line 9: `    }'

  6. #6
    Membre confirmé
    Profil pro
    Ingénieur intégration
    Inscrit en
    Août 2007
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Août 2007
    Messages : 147
    Par défaut
    Merci beaucoup à tous pour vos réponses...

    Citation Envoyé par jack-ft Voir le message
    je trouve pour le moins surprenant de mettre un script de test dans le répertoire "/usr/local/sbin"!
    Il me semble que ce répertoire est réservé aux développeurs qui maîtrisent particulièrement bien unix... et, je ne sais pas pourquoi, mais j'ai des doutes...
    Peux-tu nous dire pourquoi tu as mis ton script dans ce répertoire?
    @jack-ft : j'ai toujours mis mes scripts sous "/usr/local/sbin", même ceux de tests... à vrai dire je ne me suis jamais posé la question pourquoi!
    Que me conseillerais-tu?

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 653
    Par défaut
    Bonjour,

    Citation Envoyé par nymmus7
    j'ai toujours mis mes scripts sous "/usr/local/sbin", même ceux de tests... à vrai dire je ne me suis jamais posé la question pourquoi!
    Que me conseillerais-tu?
    sûrement pas /usr/local/sbin :
    Citation Envoyé par man hier
    /usr/local/sbin
    Programmes d'administration installés localement.
    à la rigueur, /usr/local/bin si les programmes doivent être accessibles par d'autres utilisateurs, sinon $HOME/bin
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Appel d'un script PHP depuis PERL
    Par tazmann dans le forum Web
    Réponses: 7
    Dernier message: 09/11/2007, 02h12
  2. Appel d'un script depuis un script...
    Par byloute dans le forum Linux
    Réponses: 1
    Dernier message: 27/10/2005, 16h13
  3. Appel d'un script SQL dans une procdure stockée
    Par doudou10000 dans le forum Oracle
    Réponses: 10
    Dernier message: 01/12/2004, 10h01
  4. Réponses: 7
    Dernier message: 30/09/2004, 12h19
  5. [Kylix] Appel d'un script depuis un Kylix...
    Par paty.olivier dans le forum EDI
    Réponses: 9
    Dernier message: 13/05/2004, 16h04

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