Est-il possible qu'un script shell d'origine connaisse son emplacement? J'ai lu chemin à la détermination script shell d' origine mais les réponses concentrer sur bash
et tcsh
et échouer si un shell POSIX est utilisé. $0
n'est pas non plus la solution et donne de mauvais résultats .
Une solution n'a pas besoin d'être fiable à 100%. Il est peu probable que le chemin contienne des liens durs ou des liens symboliques.
# sourcing the script should yield the absolute path to the script
. somedir/thescript
# within “thescript”
-> /tmp/foo/bar/somedir
Quelques informations: le script fait partie d'une application existante contenant des dizaines de fichiers binaires dans un bin
répertoire à un emplacement connu (varie selon l'architecture) par rapport au script d'origine. Pour utiliser l'application, l'utilisateur source le script qui ajoute le bin
répertoire au PATH
, afin que les fichiers binaires de l'application puissent être facilement invoqués dans le shell actuel (quel que soit le shell qui pourrait être).
. /path/to/script
tel queMARCO_DIR=/path/to; . $MARCO_DIR/script
oueval "$(/path/to/script)"
? @RahulPatilBASH_SOURCE
est évidemment spécifique à bash.Réponses:
L'emplacement du script d'origine n'est pas disponible sauf si vous utilisez un shell qui offre des extensions à la spécification POSIX. Vous pouvez tester cela avec l'extrait de code suivant:
où
included.sh
contientEn bash, le nom du script source est dans
$BASH_SOURCE
. En zsh (en mode de compatibilité zsh, pas en mode de compatibilité sh ou ksh), c'est dans$0
(notez que dans une fonction,$0
c'est le nom de la fonction à la place). Dans pdksh et dash, il n'est pas disponible. Dans ksh93, cette méthode ne révèle pas la solution, mais le chemin complet vers le script inclus est disponible en tant que${.sh.file}
.Si nécessiter bash ou ksh93 ou zsh est suffisant, vous pouvez utiliser cet extrait:
Vous pouvez essayer de deviner l'emplacement du script en examinant les fichiers ouverts par le shell. Expérimentalement, cela semble fonctionner avec dash et pdksh mais pas avec bash ou ksh93 qui au moins pour un court script ont fermé le fichier de script au moment où ils se mettent à l'exécuter.
Le script peut ne pas être le fichier avec le descripteur le plus élevé si le script provient d'un script complexe qui a joué avec des redirections. Vous voudrez peut-être parcourir les fichiers ouverts. Ce n'est pas garanti de fonctionner de toute façon. La seule façon fiable de localiser un script source est d'utiliser bash, ksh93 ou zsh.
Si vous pouvez modifier l'interface, au lieu de rechercher votre script, demandez à votre script d'imprimer un extrait de shell à transmettre à
eval
l'appelant. C'est ce que font généralement les scripts pour définir les variables d'environnement. Il permet à votre script d'être écrit indépendamment des aléas du shell de l'appelant et de la configuration du shell.Dans l'appelant:
eval "`/path/to/setenv`"
la source
En ajoutant à la réponse de Gilles, vous POUVEZ être en mesure d'obtenir le script shell (
if $0 = ash
) via le/proc/$$ interface
. Je ne sais pas à quel point c'est précis, mais/proc/$$/fd/11
semble toujours pointer vers this_script avec les cendres de BusyBox.Fournir cela comme une réponse potentielle à ceux qui viennent sur cette page (comme moi).
La dernière réponse a été supprimée - ma réclamation pour ce fonctionnement est donc testée sur 4 plates-formes matérielles différentes (x86, ARM, XLP et powerpc). Tous donnent la même réponse de fd / 11. Un lien de lecture de
/proc/$$/fd/11
donne mon script.Andy
la source