J'ai un script bash qui a besoin de connaître son chemin d'accès complet. J'essaie de trouver un large compatible façon de le faire sans se retrouver avec une relative ou funky chemins. J'ai seulement besoin de soutien bash, pas de sh, csh, etc.
Ce que j'ai trouvé pour l'instant:
La accepté de répondre à "Peut faire un script Bash dire ce répertoire, il est stocké dans?" adresses obtenir le chemin d'accès du script via
dirname $0
, ce qui est bien, mais que peut retourner une relative chemin (comme.
), ce qui est un problème si vous voulez changer le répertoire de sauvegarde dans le script et le chemin reste du script d'annuaire. Encore,dirname
sera une pièce du puzzle.La accepté de répondre à "script Bash chemin absolu avec OSX" (OS X, mais la réponse fonctionne indépendamment) donne une fonction qui permettra de tester pour voir si
$0
semble relative, et si tel est pré-pend$PWD
. Mais le résultat peut encore avoir par rapport bits (bien que dans l'ensemble c'est absolu) — par exemple, si le script est -t
dans le répertoire/usr/bin
et vous êtes en/usr
et vous tapezbin/../bin/t
pour l'exécuter (oui, c'est alambiqué), vous vous retrouvez avec/usr/bin/../bin
comme le script du chemin d'accès au répertoire. Ce qui fonctionne, mais...-
L'
readlink
solution sur cette page, qui ressemble à ceci:# Absolute path to this script. /home/user/bin/foo.sh SCRIPT=$(readlink -f $0) # Absolute path this script is in. /home/user/bin SCRIPTPATH=`dirname $SCRIPT`
Mais
readlink
n'est pas POSIX et, apparemment, la solution repose sur GNU -readlink
où BSD ne fonctionne pas pour une raison quelconque (je n'ai pas accès à un BSD-like système pour vérifier).
Ainsi, les différentes façons de le faire, mais ils ont tous leurs mises en garde.
Ce serait une meilleure façon? Où "plus" signifie:
- Donne-moi le chemin d'accès absolu.
- Prend funky bits, même lorsqu'il est invoqué dans un alambiqué (voir commentaire n ° 2 ci-dessus). (E. g., au moins modérément canonicalizes le chemin.)
- Ne repose que sur le coup-ismes ou des choses qui sont presque certain d'être sur la plus populaire des saveurs de systèmes *nix (GNU/Linux, BSD et BSD-like des systèmes tels que OS X, etc.).
- Évite l'appel de programmes externes si possible (par exemple, préfère bash built-ins).
- (Mise à jour, merci pour la tête, qui) N'a pas à résoudre les liens symboliques (en fait, je ferais en sorte de le préfèrent les a laissés seuls, mais ce n'est pas une obligation).
Merci à l'avance.