Trouver un path absolu à partir d'un script

Dans un script, j'obtiens dans $0 le path relatif possible. 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##*/} . On dirait que le premier extrait le dirname et le second extrait le nom de file, je ne comprends pas comment.

Définitions:

${ssortingng%subssortingng} supprime la plus courte correspondance de $subssortingng de la fin de $ssortingng .

${ssortingng##subssortingng} supprime la plus longue correspondance de $subssortingng depuis le début de $ssortingng .

Votre exemple:

 abspath=$(cd ${0%/*} && echo $PWD/${0##*/}) 

${0%/*} supprime tout ce qui se trouve après la dernière barre oblique, vous donnant le nom du directory du script (qui peut être un path relatif).

${0##*/} supprime tout jusqu'au dernier slash, vous donnant juste le nom du script.

Cette command change donc le directory du script et concatène le directory de travail en cours (donné par $PWD ) et le nom du script vous donnant le path absolu.

Pour voir ce qui se passe essayez:

 echo ${0%/*} echo ${0##*/} 

Shawn avait la solution la plus simple: readlink -f $0 . Si vous voulez être absolument sûr de gérer des noms de files étranges, vous pouvez utiliser ceci:

 absolute_path_x="$(readlink -fn -- "$0"; echo x)" absolute_path="${absolute_path_x%x}" 

Documentation

Voici un moyen plus sûr et plus lisible de faire ce travail:

 abspath=$(unset CDPATH && cd "$(dirname "$0")" && echo $PWD/$(basename "$0")) 

Remarques:

  • Si $0 est un nom de file vide sans path précédent, le script d'origine échouera mais celui qui est donné ici fonctionnera. (Pas un problème avec $0 mais pourrait être dans d'autres applications.)
  • L'une ou l'autre approche échouera si le path d'access au file n'existe pas réellement. (Pas un problème avec $0 , mais pourrait être dans d'autres applications.)
  • L' unset est essentielle si votre user peut avoir défini CDPATH .
  • Contrairement à readlink -f ou realpath , cela fonctionnera sur les versions non Linux d'Unix (par exemple, Mac OS X).

Si vous voulez apprendre l'Expansion des parameters 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 Unix ont 2 bons utilitaires:

 basename dirname 

Le premier va extraire le nom de file, tandis que le second va extraire le path, donc, si vous avez $ 0, dites:

 dirname $0 

Et vous aurez le path.

À votre santé

Présentation de pwd, le bash embedded. Aussi trouvé dans le package GNU coreutils.

 $ sh ./cygdrive/c/cygwin/home/../../../../home/jaroslav/tmp/somewhere.sh $0: ./cygdrive/c/cygwin/home/../../../../home/jaroslav/tmp/somewhere.sh cheeky binary from /home/jaroslav/tmp (/home/jaroslav/tmp) $ cat /home/jaroslav/tmp/somewhere.sh abs=$( cd `dirname "$0"` ; pwd -P) absBin=$( cd `dirname "$0"` ; /bin/pwd -P) echo \$0: $0 echo cheeky binary from $abs \($absBin\)