Existe-t-il une commande Unix pour obtenir le chemin absolu (et canonique) à partir d’un chemin relatif pouvant contenir des liens symboliques?
63
Vous pouvez utiliser l' readlink
utilitaire, avec l' -f
option:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
Certaines distributions, par exemple celles qui utilisent GNU coreutils et FreeBSD , sont également fournies avec un realpath(1)
utilitaire qui appelle realpath(3)
et fait à peu près la même chose.
-f
commutateur n'existe pas sur Mac OS X (au moins à partir de 10.8.5). Sans le-f
commutateur, il ne fait que renvoyer un code d'erreur.readlink
nirealpath
- Solaris et HP-UX, en particulier.brew install coreutils
apple.stackexchange.com/a/69332/23040 , et si vous ne souhaitez pas effectuer l'étape qui redirige tous les outils CLI du Mac standard vers les équivalents GNU nouvellement installés, appelez simplementgreadlink
.De manière portable, la
PWD
variable est définie par le shell sur un emplacement absolu du répertoire actuel. Tout composant de ce chemin peut être un lien symbolique.Si vous voulez éliminer
.
et..
aussi bien, allez dans le répertoire contenant le fichier et obtenez-$PWD
y:Il n'y a pas de moyen portable de suivre des liens symboliques. Si vous avez un chemin d'accès à un répertoire, alors sur la plupart des ordinateurs,
$(cd -- "$dir" && pwd -P 2>/dev/null || pwd)
un chemin n'utilisant pas de liens symboliques, car les shells qui suivent les liens symboliques ont tendance à être implémentéspwd -P
(«P» pour «physique»).Certains ordinateurs fournissent un utilitaire pour imprimer le chemin «physique» vers un fichier.
readlink -f
, tout comme FreeBSD ≥8.3, NetBSD ≥4,0 et OpenBSD dès la version 2.2.realpath
(il est également présent sur certains systèmes Linux, et il est dans BusyBox).Si Perl est disponible, vous pouvez utiliser le
Cwd
module .la source
pwd
($(cd -- "$dir" && pwd -P 2>/dev/null | pwd)
)? Il ne semble pas se soucier de stdin.||
Est
pwd
adapté à vos besoins? Il donne le chemin absolu du répertoire courant. Ou peut-être que ce que vous voulez, c'est realpath () .la source
alister
etrss67
dans cet article, introduisez le moyen le plus stable, compatible et le plus simple. Je n'ai jamais vu de meilleure façon que cela avant.Si vous voulez revenir à l'emplacement d'origine,
ou
Je souhaite que cela aide. C'était la meilleure solution pour moi.
la source
ABSPATH=$(cd -- "$RELPATH" && pwd)
. Notez les guillemets autour de la substitution (afin de ne pas rompre si le chemin contient des espaces et des caractères globulants) et le--
(dans le cas où le chemin commence par-
). De plus, cela ne fonctionne que pour les répertoires et ne canonise pas les liens symboliques comme demandé. Voir ma réponse pour plus de détails.Les autres réponses ici étaient bien mais étaient insuffisantes pour mes besoins. J'avais besoin d'une solution que je pourrais utiliser dans mes scripts sur n'importe quelle machine. Ma solution a été d'écrire un script shell que je peux invoquer à partir des scripts où j'en ai besoin.
Cette solution est écrite pour le shell Bourne pour la portabilité. J'ai ceci dans un script nommé "respath.sh".
Ce script peut être utilisé comme ceci:
Ou comme ça
Le script résout le chemin dans le premier argument en utilisant le chemin du deuxième argument comme point de départ. Si seul le premier argument est fourni, le script résout le chemin relatif à votre répertoire de travail actuel.
la source
pwd
intégré et ne prend pas en charge-P
(le shell Bourne n’a pas implémenté cette gestion logique $ PWD comme le font les shell POSIX).cd -P --
aussi au cas où le premier argument en contiendrait ..case
chèque devrait être à la..|../*)
place de..*
.dirname $cwd
Si, en outre, vous avez un chemin prédéfini pour
$1
(généralement${PWD}
), ceci fonctionne:la source
En respectant les réponses de tous les autres, j’ai trouvé la fonction ci-dessous très facile et portable entre Linux / MAC OSX et d’autres que j’ai trouvée partout. Peut aider quelqu'un.
la source
Supposons que la variable a stocke un nom de chemin (a = "quel que soit")
1. Pour un chemin potentiel contenant de l’espace:
2. Pour la question réelle, c'est-à-dire la conversion du chemin en absolu: readlink peut extraire le contenu d'un lien symbolique, ce qui peut être utilisé comme suit. (la note
readlink -f
aurait été parfaite mais n’est pas disponible dans au moins Mac OS X bash, où -f signifie FORMATS .)3. Vient d’apprendre
pwd -P
dansman pwd
: -P consiste à " Afficher le répertoire de travail physique actuel (tous les liens symboliques résolus) " "et doncdoit travailler aussi.
Conclusion: combinez 1 et 2 pour satisfaire vos exigences, tandis que les noms de chemins contenant des espaces sont déjà pris en charge dans le 3, plus concis .
la source