J'ai un fichier de script bash, qui est placé dans un répertoire ajouté à $ PATH afin que je puisse appeler le script à partir de n'importe quel répertoire.
Il existe un autre fichier texte dans le même répertoire que le script. Je me demande comment faire référence au fichier texte dans le script?
Par exemple, si le script doit uniquement générer le contenu du fichier texte, cat textfile
cela ne fonctionnera pas, car lorsqu’il appelle le script depuis un autre répertoire, le fichier texte n’est pas trouvé.
Réponses:
Celles-ci devraient fonctionner de la même manière, tant qu'il n'y a pas de lien symbolique (dans l'extension du chemin ou le script lui-même):
MYDIR="$(dirname "$(realpath "$0")")"
MYDIR="$(dirname "$(which "$0")")"
Une version en deux étapes de tout ce qui précède:
MYSELF="$(realpath "$0")"
MYDIR="${MYSELF%/*}"
S'il y a un lien symbolique sur le chemin de votre script, il
which
fournira une réponse n'incluant pas la résolution de ce lien. Sirealpath
n'est pas installé par défaut sur votre système, vous pouvez le trouver ici .[EDIT]: Comme il ne semble y
realpath
avoir aucun avantage par rapport à ce quereadlink -f
suggère Caleb , il est probablement préférable d’utiliser ce dernier. Mes tests de chronométrage indiquent qu'il est effectivement plus rapide.la source
realpath
vient votre système? (Pour les autres qui ne l'ont pas, vous pouvez utiliserreadlink -f
realpath
remonte à avantreadlink -f
(et mêmereadlink
, IIRC) était dans GNU coreutils (il existait plusieurs outils similaires autour. estreadlink -f
finalement devenu le standard de facto);realpath
n'est conservé que pour des raisons de compatibilité avec les scripts qui l'utilisent encore.$(dirname "$(which "$0")")
sur$(dirname $0)
où lewhich
n'est plus présent? N'est-ce pas pareil?readlink -f
ne semble pas fonctionner sur Mac OS X 10.11.6, maisrealpath
fonctionne tout de suite.Mes systèmes n'ont pas
realpath
comme suggéré par rozcietrzewiacz .Vous pouvez accomplir cela en utilisant la
readlink
commande. L'avantage d'utiliser cette méthode par rapport à l'analyse syntaxiquewhich
ou à d'autres solutions est que, même si une partie du chemin ou du nom de fichier exécuté était un lien symbolique, vous seriez en mesure de trouver le répertoire dans lequel se trouvait le fichier réel.Votre fichier texte pourrait alors être lu dans une variable comme celle-ci:
la source
which
suggestion. La solution normale à cela implique soit simplement,dirname
soit une combinaison decd
etpwd
dans un sous-shell. Readlink a l'avantage ici.realpath
semble à peu près être juste un wrapper pour dereadlink -f
toute façon.realpath
c'est différent dereadlink -f
. Je peux seulement voir que cela me donne les mêmes résultats (par opposition àwhich
).readlink -f
(de GNU coreutils) ne nécessite PAS que le dernier élément du chemin existe, existereadlink -e
, mais n'est pas pris en chargebusybox readlink
, ce qui imite le comportement de-e
leur-f
option.$0
dans le script sera le chemin complet du script, etdirname
prendra un chemin complet et ne vous donnera que le répertoire afin que vous puissiez le faire pour cat textfile:la source
realpath $0
, vous avez tort de dire que "$0
dans le script sera le chemin complet du script".$0
est la commande telle qu'elle a été exécutée, ce qui peut être par exemple../script.sh
.$(dirname "$0")
renvoie en fait le chemin relatif au script, dans le cadre de la commande appelée - et non le chemin absolu. Cela peut entraîner des problèmes dans les scripts qui changent de répertoire en cours d’exécution.Vous pouvez mettre ceci en haut de votre script:
Source: http://mywiki.wooledge.org/BashFAQ/028
la source
J'essayais cela et realpath ne fonctionnait pas pour moi. La solution que j'ai choisie est la suivante:
Ce qui a bien fonctionné jusqu'à présent. J'aimerais savoir s'il y a des problèmes potentiels avec l'approche.
la source
SCRIPT_DIR="$( cd "$(dirname "$( readlink -f ${BASH_SOURCE[0]} )")" >/dev/null 2>&1 && pwd)"
J'utilise:
Ce qui est POSIX et devrait fonctionner tant que le nom du répertoire
$0
ne se termine pas par des caractères de nouvelle ligne, n’est pas-
et$CDPATH
n’est pas défini (et éventuellement quelques autres cas de coin si le script n’a pas été consulté$PATH
).la source
J'utilise toujours
which
pour trouver le chemin complet d'un exécutable à partir de PATH. Par exemple:which python
Si vous combinez cela avec la
dirname
commande, vous obtenez:la source