web-dev-qa-db-fra.com

Comment exécuter 'cd' dans le script Shell et y rester une fois le script terminé?

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 une fois le script terminé, mon répertoire de travail actuel ne change pas.

Est-il possible de changer mon chemin par script?

65
qrtt1

Vous devez source le fichier comme:

. myfile.sh

ou

source myfile.sh

Sans sourcing, les modifications se produiront dans le sous-shell et non dans le shell parent qui appelle le script. Mais lorsque vous sourcez un fichier, les lignes du fichier sont exécutées comme si elles avaient été saisies sur la ligne de commande.

79
codaddict

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

# Bash
source yourscript.sh
# or POSIX sh
. yourscript.sh
15
schot

Bien que la recherche du script que vous souhaitez exécuter soit 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 en tant que fonction dans bash.

function cdbm() {
    cd whereever_you_want_to_go
     echo arguments to the functions were $1, $2, ...
}

Cette technique est utilisée par autojump: http://github.com/joelthelion/autojump/wiki pour vous fournir l'apprentissage des signets du répertoire Shell.

13
thomasd

Cela peut être réalisé par sourcing. Le sourcing consiste essentiellement à exécuter le script dans le même shell, tandis que l'exécution normale (sh test.sh ou ./test.sh) créera un sous-shell et y exécutera un script.

test.sh

cd development/
ls
# Do whatever you want.

Exécutez test.sh par

source test.sh

. est la notation la plus courte pour source. Vous pouvez donc aussi faire

. test.sh

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

3
Fizer Khan

chaque fois que vous exécutez un script sur votre shell de connexion, un nouveau sous-processus est généré et l'exécution du script se fait dans un sous-shell.Une fois le script terminé, le sous-shell se ferme et vous revenez au shell de connexion. , le répertoire est remplacé par le chemin spécifié par cd, mais à la fin du script, vous revenez à votre shell de connexion dans le répertoire de travail à partir duquel vous avez démarré le script.

La façon de surmonter cela est d'utiliser,

source yourscript.sh

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

1
dig_123