Voir: Entrée FAQ BASH n ° 28: "Comment déterminer l'emplacement de mon script? Je veux lire certains fichiers de configuration à partir du même endroit."
Aucune solution ne fonctionnera à 100%:
Il est important de réaliser que dans le cas général, ce problème n'a pas de solution. Toute approche dont vous avez peut-être entendu parler, et toute approche qui sera détaillée ci-dessous, présente des défauts et ne fonctionnera que dans des cas spécifiques. Avant tout, essayez d'éviter complètement le problème en ne dépendant pas de l'emplacement de votre script!
Si vous avez besoin d'écrire un outil très réutilisable, alors prendre le chemin correct comme paramètre de votre script sera la méthode la plus fiable .
En supposant que votre script ne sera exécuté qu'à partir de certains shells, et seulement avec un peu de flexibilité nécessaire, vous pouvez probablement relâcher une partie de cette paranoïa. Il est toujours bon de regarder vos options. Les gens utilisent des modèles courants qui sont particulièrement problématiques.
En particulier, la FAQ recommande d'éviter la $0
variable très couramment utilisée :
Rien de ce qui lit $0
ne sera jamais à l'épreuve des balles, car $0
lui-même n'est pas fiable.
Comme alternative, vous pouvez utiliser à la $BASH_SOURCE
place. Quelque chose comme ça:
source "${BASH_SOURCE%/*}/act.conf.sh"
Cette solution comporte également quelques mises en garde. Consultez la page FAQ pour voir les compromis entre les différentes solutions. Ils semblent recommander cd
en combinaison avec $BASH_SOURCE
dans les cas où cela fonctionnera pour vous, car vous obtenez une condition d'erreur pratique lorsqu'il ne se développe pas correctement.
readlink
. N'a pas été en mesure de déterminer les mots-clés à rechercher, alors j'ai posé la question ici ....cd "${BASH_SOURCE%/*}" || exit
ouread somevar < "${BASH_SOURCE%/*}/etc/somefile"
, Link décourage fortement$0
"Rien qui lit $ 0 ne sera jamais à l'épreuve des balles, car $ 0 lui-même n'est pas fiable."Voir ceci: Bash: Comment _best_ inclure d'autres scripts?
Je suggère d'utiliser:
la source
$0
est intrinsèquement bogué. Voir la réponse la plus votée et acceptée pour savoir pourquoi, ou lisez simplement mywiki.wooledge.org/BashFAQ/028 - une courte solution de contournement pour la question posée est quelque chose commesource "${BASH_SOURCE%/*}/act.conf.sh"
Essayez ce qui suit:
la source