6
votes

Comment un script KSH peut-il déterminer le chemin complet de lui-même, lorsqu'il est provenant d'un autre?

Comment un script peut-il déterminer son chemin quand il est provenant de ksh? IE

$ cat k.ksh
#!/bin/ksh
. j.ksh
$ cat j.ksh
#!/bin/ksh
a=$(history | tail -1)
echo $a
$ ./k.ksh
270 ./k.ksh

ksh

4 Réponses :


0
votes

Vous devriez le trouver comme dernière commande de l'histoire.


1 commentaires

Bonne idée, mais cela ne fonctionne pas comme prévu (pour moi au moins) ... Je vais ajouter mon exemple de code à la question car je ne peux pas poster le code facilement ici.



1
votes

Je crois que la seule solution portable consiste à remplacer la commande source: xxx

puis utilisez la source au lieu de. (Le nom du script sera en $ source).


0 commentaires

6
votes

Si c'est l'AT & T ksh93 code>, ces informations sont stockées dans l'espace de noms code> code>, dans la variable .sh.file code>.

Exemple h3>

Sourced.sh code>: p> xxx pré>

Invocation: p>

$ echo ${.sh.file:?}
-ksh: .sh.file: parameter not set


0 commentaires

1
votes

La différence de cours entre l'approvisionnement et le forking est que l'approvisionnement entraîne le script invoqué étant exécuté dans le processus d'appel. Henk a montré une solution élégante à Ksh93, mais si, comme moi, vous êtes coincé avec KSH88, vous avez besoin d'une alternative. Je préférerais ne pas changer la méthode KSH par défaut d'approvisionnement en utilisant la syntaxe C-Shell et au travail, ce serait à l'encontre de nos normes de codage, la création et l'utilisation d'une fonction source () ne seraient pas impraticable pour moi. PS, 0 $ et $ _ ne sont pas fiables, voici une alternative:

$ chat b.sh; chat c.sh; ./b.sh

PID:21665
COMMAND (from ps -o args of the PID): /bin/ksh ./b.sh
COMMAND (from c.sh's $_ ) : SCRIPT=c.sh
$SCRIPT variable: c.sh
dirname: .


PPID: 21665
FORKING c.sh
PID:21669
COMMAND (from ps -o args of the PID): /bin/ksh ./c.sh
COMMAND (from c.sh's $_ ) : ./c.sh
$SCRIPT variable: c.sh
dirname: .


0 commentaires