web-dev-qa-db-fra.com

Lors de l'écriture d'un script bash, comment puis-je obtenir le chemin absolu de l'emplacement du fichier actuel?

Supposons que j'ai un fichier bash appelé myBash.bash. Il réside dans:

/myDirect/myFolder/myBash.bash

Maintenant, je veux utiliser la chaîne /myDirect/myFolder (l'emplacement de myBash.bash) dans le script. Existe-t-il une commande que je peux utiliser pour trouver cet emplacement?

Edit: L'idée est que je souhaite configurer un dossier Zip avec du code pouvant être lancé par un script bash dans ce fichier Zip. Je connais les chemins de fichiers relatifs du code à l'intérieur de ce fichier Zip, mais pas les chemins absolus, et j'ai besoin de ceux-ci. Une solution consisterait à coder en dur dans le chemin ou à exiger que le chemin du fichier soit donné en tant que variable. Cependant, je trouverais cela plus facile s'il était possible pour le fichier bash de déterminer lui-même où il se trouve, puis de créer les chemins appropriés vers l'autre fichier à partir de sa connaissance de la structure du fichier Zip.

10
dimpol

Vous pouvez obtenir le chemin complet comme:

realpath "$0"

Et comme souligné par Serg vous pouvez utiliser dirnamepour effacer le nom du fichier comme ceci

dirname "$(realpath $0)"

ou encore mieux pour éviter les guillemets embarrassants et le fractionnement de Word avec des noms de fichiers difficiles:

temp=$( realpath "$0"  ) && dirname "$temp"

Beaucoup mieux que mon idée précédente qui consistait à l'analyser (je savais qu'il y aurait un meilleur moyen!)

realpath "$0" | sed 's|\(.*\)/.*|\1|'

Remarques

  • realpathrenvoie le chemin d'accès réel d'un fichier
  • $0 est ce fichier (le script)
  • s|old|new| remplace oldpar newname__
  • \(.*\)/ enregistre tous les caractères avant / pour plus tard
  • \1 la partie sauvegardée
15
Zanna

si le script est sur votre chemin, vous pouvez utiliser quelque chose comme

$ myloc=$(dirname "$(which foo.sh)")
$ echo "$myloc"
/path/to/foo.sh

EDIT: après avoir lu les commentaires de Serg, cela pourrait être une solution générique qui fonctionne que le script soit dans votre chemin ou non.

myloc==$(dirname "$(realpath $0)")
dirname "$myloc"
5
Antonello Piemonte

La réponse acceptée semble parfaite. Voici une autre façon de le faire:

cd "$(dirname "$0")"
/bin/pwd

/bin/pwd affiche le chemin réel du répertoire, par opposition à la commande intégrée pwd.

4
serv-inc
wdir="$PWD"; [ "$PWD" = "/" ] && wdir=""
case "$0" in
  /*) scriptdir="${0}";;
  *) scriptdir="$wdir/${0#./}";;
esac
scriptdir="${scriptdir%/*}"
echo "$scriptdir"

Il est pris comme référence de kenorb et andro
Pas de nom de répertoire, readlink, realpath, BASH_SOURCE
Tous sont intégrés

0
HemanthJabalpuri