Je suis en train d'écrire un script bash (extrêmement désagréable expérience, comme toujours) et j'ai besoin de le répertoire de travail actuel à agir sainement. Quand je lance le script à partir du répertoire dans lequel il est, c'est la fin. Cependant, quand je le lance à partir de quelque part d'autre, le répertoire de travail actuel est pour une raison propagées vers le script. Ce n'est évidemment pas souhaitable. Les solutions réclamées, par exemple, ici, ne fonctionne pas; en tout cas, je refuse de croire que c'est compliqué de faire quelque chose de si simple.
Réponses
Trop de publicités?Essayez les solutions suivantes simple one-liners:
Pour tous les *nix
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
Vous pouvez également définir la fonction suivante dans bash:
realpath () {
[[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}
Pour Linux, Mac et les autres *BSD:
cd $(dirname `realpath $0`)
Avec les espaces blancs de soutien:
cd "$(dirname "$(realpath "$0")")";
Remarque: realpath
doit être installé dans la plupart des distribution Linux par défaut (comme Ubuntu), mais dans certains, il peut être manquant, donc vous devez l'installer.
Sinon, vous pouvez essayer quelque chose comme ça (il utilise le premier outil existant):
cd $(dirname `readlink -f $0 || realpath $0`)
Pour Linux spécifiques:
cd $(dirname $(readlink -f $0))
L'utilisation de GNU readlink sur *BSD/Mac:
cd $(dirname $(greadlink -f $0))
Remarque: Vous devez disposer d' coreutils
installé
(par exemple, 1. Installer Homebrew, 2. brew install coreutils
).
En bash
En bash, vous pouvez utiliser le Paramètre Expansions de réaliser que, comme:
cd ${0%/*}
mais il ne fonctionne pas si le script est exécuté à partir du même répertoire.
Connexes:
Comment détecter le répertoire courant dans lequel j'exécute mon script shell?
Moyen fiable pour un script bash pour obtenir le chemin d'accès complet à lui-même?
Voir aussi:
Comment puis-je obtenir le comportement de GNU readlink -f sur un Mac?