91 votes

Comment exécuter 'cd' dans un script shell et y rester après la fin du script?

J'ai utilisé 'changer de répertoire' dans mon script shell (bash)

#!/bin/bash
alias mycd='cd some_place'
mycd
pwd

pwd imprime some_place correctement, mais après l'exécution du script, mon répertoire de travail actuel ne change pas.

Est-il possible de changer mon chemin par script ?

0 votes

Je fais quelques modifications dans le code d'exemple. En bash, cd devrait être fait via un alias ou une fonction.

0 votes

98voto

codaddict Points 154968

Vous devez sourcer le fichier comme suit :

. myfile.sh

ou

source myfile.sh

Sans sourcer, les modifications se produiront dans le sous-shell et non dans le shell parent appelant le script. Mais lorsque vous sourcez un fichier, les lignes du fichier sont exécutées comme si elles étaient tapées à la ligne de commande.

21voto

thomasd Points 304

En cherchant le script que vous souhaitez exécuter est une solution, vous devez savoir que ce script peut alors modifier directement l'environnement de votre shell actuel. De plus, il n'est plus possible de passer des arguments.

Une autre façon de faire est d'implémenter votre script sous forme de fonction en bash.

function cdbm() {
    cd où_vous_voulez_aller
     echo les arguments des fonctions étaient $1, $2, ...
}

Cette technique est utilisée par autojump: http://github.com/joelthelion/autojump/wiki pour vous fournir des signets de répertoire shell.

0 votes

J'ai pu transmettre des arguments à un script sourcé comme dans source my_script.sh myarg myarg est passé dans le script en tant que $1

18voto

schot Points 5809

Le script est exécuté dans un sous-shell séparé. Ce sous-shell change de répertoire, pas celui dans lequel vous l'exécutez. Une solution possible est de source le script au lieu de l'exécuter:

# Bash
source votrescript.sh
# ou POSIX sh
. votrescript.sh

4voto

Fizer Khan Points 4128

Il est possible de réaliser cela en sourçant. Sourcer consiste essentiellement à exécuter le script dans le même shell alors que l'exécution normale (sh test.sh ou ./test.sh) créera un sous-shell et exécutera le script là-bas.

test.sh

cd development/
ls
# Faites ce que vous voulez.

Exécutez test.sh par

source test.sh

. est la notation la plus courte pour source. Vous pouvez également le faire en

. test.sh

Cela exécutera le script et changera le répertoire du shell actuel en development/.

2voto

dig_123 Points 377

Chaque fois que vous exécutez un script sur votre shell de connexion, un nouveau sous-processus est lancé et l'exécution du script est effectuée dans un sous-shell. Une fois le script terminé, le sous-shell se ferme et vous revenez au shell de connexion. Ainsi, chaque fois que vous exécutez un cd via un script, le répertoire est modifié selon le chemin spécifié par le cd, mais une fois le script terminé, vous revenez à votre shell de connexion dans le répertoire de travail à partir duquel vous avez lancé le script.

La manière de surmonter ceci est d'utiliser,

source votrescript.sh

Ce que source fait, c'est qu'il exécute le script en tant que script TCL, c'est-à-dire qu'il a le même effet que si vous aviez tapé chaque ligne sur la ligne de commande de votre shell de connexion et exécuté à partir de là. De cette manière, lorsque le script termine après le cd, il reste dans ce répertoire.

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