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 :

Surcharger $0 ksh


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 164
    Par défaut Surcharger $0 ksh
    Bonjour,

    J'ai un script ksh (on va le nommer main.ksh) qui exécute un 2e script (script_xx.ksh).

    Le problème est que mon 2e script se base sur la variable $0 (le nom du script) pour récupérer un paramètre "xx" de lancement.

    Quand je lance script_xx.ksh directement tout fonctionne il retrouve bien le paramètre en lisant $0 et en découpant le nom du fichier.

    Mais quand je lance main.ksh ($0 vaut "main.ksh") qui exécute lui même script.ksh, il essaye de découper $0 pour récupérer le paramètre et forcement ne le trouve pas.

    Existe t'il un moyen de surcharger $0 pour changer sa valeur en sachant que je ne peux en aucun cas modifier script_xx.ksh ?

    je précise que je suis sous KSH.

    J''espère avoir été assez clair...


    Merci de votre aide.

    Cdlt

  2. #2
    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 Darkcristal Voir le message
    Mais quand je lance main.ksh ($0 vaut "main.ksh") qui exécute lui même script.ksh, il essaye de découper $0 pour récupérer le paramètre et forcement ne le trouve pas.
    Ne pas confondre exécuter et sourcer! (il y a plein de discussions s'y rapportant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat main.ksh
    #!/bin/ksh
    print "Dans main, \$0 vaut $0"
    print 'source foo.ksh'
    . ./foo.ksh
    print 'execute foo.ksh'
    ./foo.ksh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ cat foo.ksh 
    #!/bin/ksh
    print "Dans foo, \$0 vaut $0"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ./main.ksh 
    Dans main, $0 vaut ./main.ksh
    source foo.ksh
    Dans foo, $0 vaut ./main.ksh
    execute foo.ksh
    Dans foo, $0 vaut ./foo.ksh
    Peux-tu confirmer que ton main.ksh n'exécute pas ton script_xx.ksh mais le source ?
    Et, si oui, est-ce indispensable?

    Existe t'il un moyen de surcharger $0 pour changer sa valeur en sachant que je ne peux en aucun cas modifier script_xx.ksh ?
    à ma connaissance non. Et ça m'étonnerait beaucoup! On peut modifier $1 $2 etc. (avec set -- <args>) mais pas $0.

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

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

    je précise que je suis sous KSH.
    oui, mais lequel ?


    pour info, on n'est pas sous linux, ou sous un shell:
    il y a :
    • le sol
    • le bureau
    • la machine
    • l'OS
    • le programme
    • puis, l'humain
    donc la machine est sous un OS, et l'humain travaille sur un OS.

    Par contre, on est bien sous MiS
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Citation Envoyé par jack-ft Voir le message

    à ma connaissance non. Et ça m'étonnerait beaucoup! On peut modifier $1 $2 etc. (avec set -- <args>) mais pas $0.
    Il existe un micro moyen, mais en jonglant pas mal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo $0
    ksh
    $ exec -a toto ksh
    $ echo $0
    toto
    @Darkcristal: cette solution ne fork pas un nouveau processus, elle prend la place du processus en cours, donc ne peut être envisageable en l'état que si ton script main.ksh ne fait rien d'autre après, sinon il faut que ton script main.ksh s'auto rappelle en changeant son nom et gère son propre fonctionnement selon la valeur $0

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Darkcristal Voir le message
    J''espère avoir été assez clair...
    Salut
    Tu es tout à fait clair... mais tu es en erreur. Parce que si tu exécutes un script nommé "script_xx.ksh" alors $0 contient "script_xx.ksh". Très exactement il contient la chaine exacte utilisée pour appeler le script.
    Et ce, quel que soit l'origine de l'appel. Que ce soit depuis un autre script shell, ou bien d'une fenêtre de commande (qui n'est, si on réfléchit, rien d'autre qu'un shell en fait), ou bien depuis un programme utilisant des appels systèmes (system(), exec(), etc).
    En fait, le script est exécuté dans un nouveau contexte totalement indépendant et isolé de celui de l'appelant. A tel point qu'il est plus difficile de les faire communiquer que de les laisser s'ignorer l'un l'autre.

    Maintenant, si tu sources un script nommé "script_xx.ksh", alors c'est totalement différent. Dans ce cas, le code du script est recopié dans le shell parent qui reste dans son contexte. Et dans ce contexte, $0 reste inchangé (celui du parent).

    Donc dis-nous si tu exécutes (appel simple) ou si tu sources ton script_xx.ksh.

    Dans tous les cas, il y a une solution assez simple: tu programmes script_xx.ksh pour qu'il ne prenne pas ses éléments dans $0 mais dans un paramètre explicite (on va dire $1). Et ensuite, le parent passe cette valeur au script. Et ça, ça fonctionnera même si ton script_xx.ksh est sourcé dans le parent...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Dans tous les cas, il y a une solution assez simple: tu programmes script_xx.ksh pour qu'il ne prenne pas ses éléments dans $0 mais dans un paramètre explicite (on va dire $1). Et ensuite, le parent passe cette valeur au script. Et ça, ça fonctionnera même si ton script_xx.ksh est sourcé dans le parent...
    A priori, il ne peut pas :
    Citation Envoyé par Darkcristal Voir le message
    Existe t'il un moyen de surcharger $0 pour changer sa valeur en sachant que je ne peux en aucun cas modifier script_xx.ksh ?

  7. #7
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    et si tu renommais ton script main.ksh du nom: script_xx.ksh ?

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par noooop Voir le message
    et si tu renommais ton script main.ksh du nom: script_xx.ksh ?
    ... et qu'en plus tu fasses ça dans le même dossier que celui qui possède déjà "script_xx.ksh"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    ... et qu'en plus tu fasses ça dans le même dossier que celui qui possède déjà "script_xx.ksh"...
    rien ne dit que le main est dans le meme dossier que le script en question. je disait ca car j'ai l'impression que le nom du script possede une information necessaire

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/12/2003, 10h23
  2. Surcharge de fonction d'un edit dynamique
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/10/2003, 11h56
  3. Réponses: 5
    Dernier message: 24/04/2003, 11h47
  4. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 11h42
  5. Réponses: 8
    Dernier message: 20/11/2002, 11h50

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