8
votes

Kornshell - Set "-x" drapeau de débogage globalement?

existe-t-il un moyen de définir le mode de débogage ( SET -X CODE> ) sur un script Kornshell (ksh) dans le monde entier? Actuellement, il semble que j'ai fait quelque chose comme ce qui suit:

dev2:/home/me-> ./testSetX
+ a
This is A!
+ echo Outside
Outside
+ b
This is B!
dev2:/home/me->


2 commentaires

C'est bizarre. Je viens aussi de l'essayer dans ksh88 (et ksh93) sur l'un de mes systèmes AIX et que je reçois le BeHvior décrit. Mais le ksh88 sur mes systèmes HP-UX fonctionne comme vous le souhaitez. J'ai modifié ma réponse pour refléter les résultats.


fyi, ksh88 / usr / bin / ksh sur Solaris 10 montre également le comportement décrit (aucun effet global SET -X ).


5 Réponses :


4
votes

Ajoutez-le à votre ligne Shebang: xxx

ou réglez-le en haut de votre script: xxx

ou démarrez votre script de la ligne de commande: xxx


1 commentaires

Malheureusement, rien de ces travaux pour moi. Je ne vois que les noms des méthodes. C'est peut-être parce que j'utilise ksh88.



8
votes

Ceci est ksh88 sur une machine HP-UX: xxx

Ça sûr looks comme ça fonctionne bien. J'ai validé que cela fonctionne également avec un "SET -X" n'importe où avant la première application de fonction.

J'ai déplacé dans un système AIX et a connu le problème que vous avez décrit. Lorsque les fonctions sont définies comme une fonction un { ou a () { dans aix ksh88, le SET -X ne semble pas reporter dans la fonction de fonction locale. Passer à KSH93 sur la même boîte AIX, fonctions déclarées à l'aide de la nouvelle fonction La syntaxe { Ne transportez pas non plus l'extérieur SET -X dans la portée intérieure. Cependant, KSH93 se comporte comme POSIX SH (et KSH88 sur d'autres plates-formes) utilisées pour se comporter, portant le SET -X à la fonction lorsque la fonction est définie dans l'ancien a () {< / code> méthode. Ceci est probablement dû à la compatibilité à l'envers de KSH93, où il essaie d'imiter l'ancien comportement lorsque des fonctions sont définies à l'ancienne.

Par conséquent, vous pourrez peut-être changer temporairement l'interprète sur KSH93 pour le débogage. Ensuite, puis retournez à KSH88 si vous n'aimez pas avoir les matrices plus longues, les tableaux associatifs, les mathématiques de point flottant, le support d'espace de noms et une amélioration de la vitesse de l'exécution de Rougly 10x. ;) Parce que cela semble que la réponse est "Non, tu ne peux pas faire ça" avec ksh88 sur Aix. : (


2 commentaires

Merci pour la grande recherche, je verrai d'être mis à niveau vers Ksh93, mais dans mon environnement ...


IBM fournit ksh93 et ​​ksh88 dans le même paquet (au moins ils font sur les systèmes AIX 5.3 et 6.1 que j'ai examinés); Le binaire est juste appelé ksh93. Si cela aide ... :)



1
votes

Sachez que le scopage est affecté entre les deux types de déclarations de fonction xxx

vs. xxx

en particulier, le typset sous Ksh ne fonctionne pas comme vous l'attendez dans l'ancien cas. Découvert en essayant de déboguer un script avec une fonction récursive. Plus d'informations ici:

http: //www.dartmouth .edu / ~ rc / classes / ksh / fonctions.html


0 commentaires

1
votes

Le comportement de "Set -X" est une "particularité" de la coque Aix (ne pas dire cerveau d ...).

Vous avez demandé "un moyen de définir le mode de débogage ... globalement" . Voici ce que je fais pour atteindre cet objectif: xxx

pour activer le traçage, définir $ set_x dans l'environnement de votre script sur " défini -x ". Pour contrôler cela sur une base téléphonique, préfixez l'appel avec " set_x = 'SET -X' ". Comme une variable d'environnement est utilisée, cette méthode fonctionne naturellement avec des appels imbriqués.

toutes ces utilisations de " $ set_x; " sont un peu laids, mais cela fonctionne avec tous les coquilles, et la prestation l'emporte généralement sur le coût.

Un autre exemple d'une coquille AIX "particularité": xxx

the ci-dessus doit imprimer "piégé au niveau de la portée du fichier" , mais ne imprime rien.


0 commentaires

4
votes

J'ai testé un ensemble global SET -X code> avec KSH88 (sur Solaris 10) et KSH93 (Fedora 17) et avec une commande globale SET -X code> en haut de Le script n'a pas de portée locale (c.-à-d. Il n'a pas d'effets locaux).

comme solution de contournement, vous pouvez activer la traçabilité de la commande locale pour toutes les fonctions de portée (après leur définition) et avant qu'elles ne soient appelées via Typeset Code>: P>

$ bash test.ksh
15: foo
6: echo Hello
Hello
16: bar
10: echo World
World


1 commentaires

+1 Cela a fonctionné pour moi en utilisant KSH88 sur AIX 5.3 et 7.1. Ce serait bien s'il y avait plus d'explication de la manière dont les œuvres de composition.