Comment exécuter un script à partir d'un autre chemin et connaître le chemin du script?

8

J'ai besoin d'exécuter un script qui accède à un fichier dans le même chemin d'accès qu'il se trouve.

Par exemple: j'ai le script dedans /home/me/folder/script.sh, et ce script accédera au fichier /home/me/folder/myfile. Comme le fichier se trouve dans le même chemin que le script, j'utilise simplement le nom myfile, pas le chemin complet.

Mais si je l'exécute /tmp/, comme:

/tmp$ /home/me/folder/script.sh

ça me donne:

myfile: No such file or directory

Alors, comment puis-je dire dans le script que le fichier se trouve dans le même chemin que le script lui-même?

Tom Brito
la source
Pouvez-vous montrer à quoi sert mon fichier ici?
Faheem Mitha
@Faheem Mitha: est juste un autre script que mon script.sh appelle.
Tom Brito
Une raison pour laquelle vous ne souhaitez pas utiliser le chemin complet, ou déplacer les deux dans votre CHEMIN?
Faheem Mitha
1
@Faheem Mitha: Je veux pouvoir déplacer ce dossier avec les scripts vers un autre endroit, peut-être même un autre ordinateur, sans avoir besoin de réécrire le chemin de mon fichier.
Tom Brito

Réponses:

8

Et alors $(dirname "$0")/myfile?

alex
la source
9

Vous ne pouvez pas savoir dans toutes les circonstances, mais souvent (pas toujours) lorsque vous exécutez un script par chemin d'accès au lieu de laisser la recherche de shell $PATH, le chemin d'accès au script sera $0. Vous pouvez ensuite utiliser dirname "$0"ou ${0%/*}pour obtenir le chemin.

geekosaure
la source
4

Je ferais normalement quelque chose comme ça à la tête de mon script:

SCRIPTDIR=$(dirname "$0")

Ou, pour obtenir le chemin d'accès complet dans le répertoire du script (au lieu d'un chemin d'accès relatif):

SCRIPTDIR=$(cd $(dirname "$0") && pwd)

Référez-vous ensuite là ${SCRIPTDIR}où vous en avez besoin.

Richard Downer
la source