Dans un script, j'obtiens $0
le chemin relatif possible vers celui-ci. Pour le convertir en absolu, j'ai trouvé cette solution que je ne comprends pas:
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
Mon problème est la magie à l'intérieur de ${0%/*}
et ${0##*/}
. Il semble que le premier extrait le nom du répertoire et le dernier extrait le nom du fichier, je ne comprends pas comment.
readlink -f $0
pour obtenir le chemin canonique.dirname
utilité est utile ici.BASH_SOURCE
c'est mieux que$0
, comme le$0
donne la commande tapée par l'utilisateur, qui pourrait ne pas être le script en cours d'exécution.Réponses:
Définitions:
${string%substring}
supprime la correspondance la plus courte$substring
de la fin de$string
.${string##substring}
supprime la plus longue correspondance de$substring
depuis le début de$string
.Votre exemple:
${0%/*}
supprime tout après la dernière barre oblique, vous donnant le nom de répertoire du script (qui peut être un chemin relatif).${0##*/}
supprime tout jusqu'à la dernière barre oblique, vous donnant simplement le nom du script.Ainsi, cette commande se transforme en répertoire du script et concatène le répertoire de travail actuel (donné par
$PWD
) et le nom du script vous donnant le chemin absolu.Pour voir ce qui se passe, essayez:
la source
Shawn avait la solution la plus simple:
readlink -f $0
. Si vous voulez être absolument sûr de gérer les noms de fichiers étranges, vous pouvez utiliser ceci:Documentation
la source
readlink -fn
est spécifique à Linux, NetBSD et OpenBSD.Voici un moyen plus sûr et plus lisible de faire ce travail:
Remarques:
$0
s'agit d'un nom de fichier nu sans chemin d'accès précédent, le script d'origine échouera mais celui donné ici fonctionnera. (Pas un problème avec$0
mais pourrait être dans d'autres applications.)$0
, mais pourrait être dans d'autres applications.)unset
est essentiel si votre utilisateur peut avoirCDPATH
défini.readlink -f
ourealpath
, cela fonctionnera sur les versions non Linux d'Unix (par exemple, Mac OS X).la source
Si vous voulez apprendre l'expansion des paramètres du shell, vous pouvez le lire à partir d' ici , mais l'expansion n'est pas toujours un bon choix. Dans ce cas, presque tous les systèmes de type Unix ont 2 bons utilitaires:
Le premier extraira le nom du fichier, tandis que le second extraira le chemin, donc, si vous avez $ 0, dites:
Et vous aurez le chemin.
À votre santé
la source
Présentation de pwd, le module intégré bash. Également trouvé dans le paquet GNU coreutils.
la source