Comment obtenir le chemin d'accès absolu du script shell sur MacOS?
readlink -f
n'existe pas sur MacOS. La seule solution qui fonctionne pour Mac OS, j'ai réussi à trouver sur le net qui va comme ceci:
if [[ $(echo $0 | awk '/^\//') == $0 ]]; then
ABSPATH=$(dirname $0)
else
ABSPATH=$PWD/$(dirname $0)
fi
Quelqu'un peut-il suggérer quelque chose de plus élégant de ce qui semble être une tâche triviale?
- Voir également étroitement liés à la question: stackoverflow.com/questions/1055671/...
Vous devez vous connecter pour publier un commentaire.
Un autre (aussi assez moche) option:
$0
ne reflète pas le chemin du script si le script est en cours de source; pour remédier à cela, l'utilisation (Bash-spécifique)$BASH_SOURCE
au lieu; (c) avec (inhabituel) les chemins qui commencent par-
, la commande break (facilement résolu en utilisant--
que le 1er argument pour lecd
et ladirname
de commande); enfin, il est préférable de ne pas utiliser de majuscules shell-les noms de variables afin d'éviter les conflits avec les variables d'environnement spéciales et variables shell.$0
,dirname -- "$0"
ne doit jamais échouer, mais, comme indiqué,$0
ne peut pas saisir le script à la main, à l'aide de (Bash-spécifique)$BASH_SOURCE
au lieu de cela répond à la fois à des questions.abspath="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")"; pwd)/$(basename -- "${BASH_SOURCE[0]}")"
.Obtenir le chemin absolu du script shell
Creusé d'anciens scripts de mon .bashrc, et mise à jour de la syntaxe un peu, ajouté une suite de tests.
Prend en charge
.
opérateur point)foo->dir1/dir2/bar bar->./../doe doe->script
Il a été testé et utilisé dans de vrais projets avec succès, cependant il peut y avoir des cas particuliers, je ne suis pas au courant de.
Si vous étiez en mesure de trouver une telle situation, s'il vous plaît laissez-moi savoir.
(Pour l'un, je sais que ce n'est pas exécuté sur le shell sh)
Code
Connu issuse
Script doit être sur le disque quelque part, que ce soit sur un réseau.
Si vous essayez d'exécuter ce script à partir d'un TUYAU, elle ne fonctionnera pas
Techniquement parlant, il n'est pas défini.
Pratiquement parlant, il n'est pas sain d'esprit moyen de détecter cette.
Cas de Test utilisé
Et le courant de cas de test que vérifier qu'il fonctionne.
PurpleFox aka GreenFox
-
briser le script, vous pouvez facilement remédier en utilisant--
que le 1er argument dans les différents appels. Comme pour ne pas être en mesure de détecter si un script est passé à l'aide de stdin, par exemple par un pipeline: autant que je sache, c'est le seul cas dans lequel$BASH_SOURCE
est vide. Trouver ce que je crois être un peu plus robuste que la mise en œuvre est également conforme à POSIX réponse (de la mine) ici.Également noter que
homebrew
's (http://brew.sh)coreutils
forfait comprendrealpath
(lien créé dans/opt/local/bin
).À l'aide de bash, je suggère cette approche. Vous premier cd dans le répertoire, puis vous prenez le répertoire courant à l'aide de la ddt. Après cela, vous devez revenir à l'ancien répertoire pour assurer votre script ne crée pas d'effets secondaires à un autre script en l'appelant.
Cette solution est en sécurité avec chemin complexe. Vous n'aurez jamais de ennuis avec des espaces ou spécial charaters si vous mettez les guillemets.
Remarque: le /dev/null, c'est d'exiger ou "cd -" imprimer le chemin de son retour.
Si vous n'avez pas l'esprit à l'aide de perl:
Pouvez-vous essayer quelque chose comme cela à l'intérieur de votre script?
Dans ma machine, il montre:
qui est le chemin d'accès absolu du script shell.
J'ai trouvé que c'était utile pour les liens symboliques /liens dynamiques - fonctionne avec GNU readlink seulement si (en raison de l'option-f):
c'est ce que j'utilise, et peut-être besoin d'un tweak ici ou là
C'est pour tout fichier et de malédiction, vous pouvez simplement appeler comme
abspath ${0}
Le premier cas traite avec des chemins relatifs, par cd-ing le chemin et le laisser pwd comprendre
Le deuxième cas, c'est pour traiter un fichier local (d'où le ${1##/} n'aurait pas travaillé)
Ce n'est PAS une tentative de défaire les liens symboliques!
Cela fonctionne tant que ce n'est pas un lien symbolique, et est peut-être légèrement moins moche:
Si vous utilisez ksh, le
${.sh.file}
paramètre est réglé sur le chemin absolu du script. Pour obtenir le répertoire parent du script:${.sh.file%/*}
- Je utiliser la fonction ci-dessous pour émuler "readlink -f" pour les scripts à exécuter sur linux et Mac OS X.
C'est la sortie de certains courants de Mac OS X objectifs:
L'est de la sortie pour certains linux cibles.