783 votes

Script Bash: place le répertoire de travail courant dans le répertoire du script

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.

933voto

ndim Points 11557
#!/bin/bash
cd "$(dirname "$0")"

391voto

Paul Schulz Points 399

Ce qui suit fonctionne également:

 cd ${0%/*}
 

251voto

kenorb Points 2464

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' coreutilsinstallé (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:

Voir aussi:

Comment puis-je obtenir le comportement de GNU readlink -f sur un Mac?

95voto

Dan Moulding Points 46866
 cd "$(dirname ${BASH_SOURCE[0]})"
 

C'est facile. Ça marche.

9voto

Amardeep Points 10417

Ce script semble fonctionner pour moi:

 #!/bin/bash
mypath=`realpath $0`
cd `dirname $mypath`
pwd
 

La ligne de commande pwd fait écho à l'emplacement du script en tant que répertoire de travail actuel, peu importe d'où je l'ai exécuté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X