Comment définir le répertoire de travail actuel dans le répertoire du script?

J’écris un script bash. J’ai besoin que le répertoire de travail actuel soit toujours le répertoire dans lequel se trouve le script.

Le comportement par défaut est que le répertoire de travail actuel dans le script est celui du shell à partir duquel je l’exécute, mais je ne souhaite pas ce comportement.

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

Ce qui suit fonctionne également:

 cd "${0%/*}" 

La syntaxe est décrite en détail dans cette réponse StackOverflow.

Essayez les simples lignes suivantes:


Pour tous UNIX / OSX / Linux

 dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P) 

Remarque: Un double tiret (-) est utilisé dans les commandes pour indiquer les options de fin de commande. Les fichiers contenant des tirets ou d’autres caractères spéciaux ne rompent donc pas la commande.


Pour Linux, Mac et autres * BSD:

 cd $(dirname $(realpath $0)) 

Avec des espaces blancs support:

 cd "$(dirname "$(realpath "$0")")"; 

Remarque: realpath doit être installé par défaut dans la dissortingbution Linux la plus populaire (comme Ubuntu), mais dans certains cas, il peut faire défaut, vous devez donc l’installer.

Sinon, vous pourriez essayer quelque chose comme ça (il utilisera le premier outil existant):

 cd $(dirname $(readlink -f $0 || realpath $0)) 

Pour Linux spécifique:

 cd $(dirname $(readlink -f $0)) 

Utiliser GNU readlink sur * BSD / Mac:

 cd $(dirname $(greadlink -f $0)) 

Note: Vous devez avoir coreutils installé (ex: 1. Installez Homebrew , 2. brew install coreutils ).


En bash

Dans bash, vous pouvez utiliser les extensions de parameters pour y parvenir, comme par exemple:

 cd ${0%/*} 

mais cela ne fonctionne pas si le script est exécuté à partir du même répertoire.

Sinon, vous pouvez définir la fonction suivante dans bash:

 realpath () { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" } 

Cette fonction prend 1 argument. Si l’argument a déjà un chemin absolu, imprimez-le tel quel, sinon, $PWD variable $PWD + l’argument du nom de fichier (sans le préfixe ./ ).

ou voici la version prise à partir du fichier Debian .bashrc :

 function realpath() { f=$@ if [ -d "$f" ]; then base="" dir="$f" else base="/$(basename "$f")" dir=$(dirname "$f") fi dir=$(cd "$dir" && /bin/pwd) echo "$dir$base" } 

En relation:

  • Comment détecter le répertoire actuel dans lequel je lance mon script shell?

  • Obtenir le répertoire source d’un script Bash depuis l’intérieur

  • Chemin absolu du script Bash avec OSX

  • Un moyen fiable pour un script bash pour obtenir le chemin complet vers lui-même?

Voir également:

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

 cd "$(dirname ${BASH_SOURCE[0]})" 

C’est facile. Ça marche.

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 où je le lance.

Obtenez le vrai chemin d’access à votre script

 if [ -L $0 ] ; then ME=$(readlink $0) else ME=$0 fi DIR=$(dirname $ME) 

(Ceci est la réponse à la même question ici: obtenir le nom du répertoire où un script est exécuté )

 cd "`dirname $(readlink -f ${0})`" 

La réponse acceptée fonctionne bien pour les scripts qui n’ont pas été associés à un lien symbolique, par exemple dans $PATH .

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

Cependant, si le script est exécuté via un lien symbolique,

 ln -sv ~/project/script.sh ~/bin/; ~/bin/script.sh 

Cela va dans le répertoire ~/bin/ et non dans le répertoire ~/project/ , ce qui va probablement casser votre script si le but du cd est d’inclure des dépendances par rapport à ~/project/

La réponse sûre du lien symbolique est ci-dessous:

 #!/bin/bash cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" 

readlink -f est requirejs pour résoudre le chemin absolu du fichier potentiellement symlinked.

Les guillemets sont requirejs pour prendre en charge les chemins de fichiers pouvant potentiellement contenir des espaces (mauvaise pratique, mais il n’est pas sûr de supposer que ce ne sera pas le cas)

 echo $PWD 

PWD est une variable d’environnement.

Si vous avez juste besoin d’imprimer le répertoire de travail présent, vous pouvez le suivre.

 $ vim test #!/bin/bash pwd :wq to save the test file. 

Autoriser l’exécution:

 chmod u+x test 

Ensuite, exécutez le script par ./test puis vous pouvez voir le répertoire de travail actuel.