Question Pourquoi "cd" ne fonctionne-t-il pas dans un script shell?


J'essaye d'écrire un petit script pour changer le répertoire courant dans mon répertoire de projet:

#!/bin/bash
cd /home/tree/projects/java

J'ai enregistré ce fichier en tant que proj, ajouté l'autorisation d'exécution avec chmodet l'a copié /usr/bin. Quand je l'appelle par: proj, ça ne fait rien. Qu'est-ce que je fais mal?


600
2017-11-01 02:07


origine


Réponses:


Les scripts Shell sont exécutés dans un sous-shell, et chaque sous-shell a son propre concept de ce qu'est le répertoire courant. le cd réussit, mais dès que le sous-shell se termine, vous êtes de retour dans le shell interactif et rien n'y a jamais changé.

Une façon de contourner cela est d'utiliser un alias à la place:

alias proj="cd /home/tree/projects/java"

506
2017-11-01 02:09



Tu ne fais rien de mal! Vous avez modifié le répertoire, mais uniquement dans le sous-shell qui exécute le script.

Vous pouvez exécuter le script dans votre processus actuel avec la commande "dot":

. proj

Mais je préfère la suggestion de Greg d'utiliser un alias dans ce cas simple.


401
2017-11-01 02:09



le cd dans votre script techniquement travaillé comme il a changé le répertoire du shell qui a exécuté le script, mais c'était un processus séparé forké de votre shell interactif.

Un moyen compatible avec Posix pour résoudre ce problème est de définir un procédure shell plutôt qu'un shell invoqué script de commande.

jhome () {
  cd /home/tree/projects/java
}

Vous pouvez simplement taper ceci ou le mettre dans l'un des différents fichiers de démarrage du shell.


193
2017-08-11 04:20



le cd est fait dans la coquille du script. Lorsque le script se termine, ce shell se ferme, et vous êtes alors dans le répertoire que vous étiez. "Source" le script, ne l'exécutez pas. Au lieu de:

./myscript.sh

faire

. ./myscript.sh

(Notez le point et l'espace avant le nom du script.)


122
2018-02-10 12:07



Pour créer un script bash qui va cd dans un répertoire select:

Créez le fichier de script

#! / bin / sh
# fichier: / scripts / cdjava
#
cd / home / askgelal / projets / java

Créez ensuite un alias dans votre fichier de démarrage.

#! / bin / sh
# fichier /scripts/mastercode.sh
#
alias cdjava = '. / scripts / cdjava '

  • J'ai créé un fichier de démarrage où je vider tous mes alias et fonctions personnalisées.
  • Ensuite, je source ce fichier dans mon .bashrc pour l'avoir défini à chaque démarrage.

Par exemple, créez un fichier alias / fonctions maître: /scripts/mastercode.sh
(Mettez l'alias dans ce fichier.)

Puis à la fin de votre .bashrc fichier:

source /scripts/mastercode.sh



Maintenant, il est facile de cd dans votre répertoire java, il suffit de taper cdjava et vous êtes là.


90
2018-05-06 03:41



L'idée de Jeremy Ruten d'utiliser un lien symbolique a déclenché une pensée qui n'a franchi aucune autre réponse. Utilisation:

CDPATH=:$HOME/projects

Le côlon principal est important; cela signifie que s'il y a un répertoire 'dir' dans le répertoire courant, alors 'cd dir'changera pour cela, plutôt que de sauter ailleurs. Avec la valeur définie comme indiqué, vous pouvez faire:

cd java

et, s'il n'y a pas de sous-répertoire appelé java dans le répertoire courant, alors il vous mènera directement à $ HOME / projects / java - pas d'alias, pas de scripts, pas d'execs douteux ou de commandes point.

Mon $ HOME est / Users / jleffler; mon $ CDPATH est:

:/Users/jleffler:/Users/jleffler/mail:/Users/jleffler/src:/Users/jleffler/src/perl:/Users/jleffler/src/sqltools:/Users/jleffler/lib:/Users/jleffler/doc:/Users/jleffler/work

36
2017-11-01 04:21



J'ai eu mon code pour travailler en utilisant. <your file name>

./<your file name> dose ne fonctionne pas car il ne change pas votre répertoire dans le terminal il change juste le répertoire spécifique à ce script.

Voici mon programme

#!/bin/bash 
echo "Taking you to eclipse's workspace."
cd /Developer/Java/workspace

Voici mon terminal

nova:~ Kael$ 
nova:~ Kael$ . workspace.sh
Taking you to eclipe's workspace.
nova:workspace Kael$ 

25
2017-10-28 19:42



Vous pouvez utiliser . pour exécuter un script dans l'environnement shell actuel:

. script_name

ou bien, son alias plus lisible mais spécifique à la coquille source:

source script_name

Cela évite le sous-shell, et permet à toutes les variables ou builtins (y compris cd) pour affecter le shell actuel à la place.


24
2018-02-10 11:59



Utilisation exec bash à la fin

Un script bash fonctionne sur son environnement actuel ou sur celui de son   enfants, mais jamais sur son environnement parent.

Cependant, cette question est souvent posée car on veut rester à l'invite bash dans un certain répertoire après l'exécution d'un script bash depuis un autre répertoire.

Si c'est le cas, exécutez simplement une instance bash enfant à la fin du script:

#!/bin/bash
cd /home/tree/projects/java
exec bash

16
2018-04-21 11:34



il suffit de lancer:

cd /home/xxx/yyy && command_you_want

13
2018-03-10 14:33



Lorsque vous déclenchez un script shell, il s'exécute Nouveau instance de cette coquille (/bin/bash). Ainsi, votre script déclenche simplement un shell, modifie le répertoire et se termine. En d'autres termes, cd (et d'autres commandes similaires) dans un script shell n'affectent ni n'ont accès au shell à partir duquel ils ont été lancés.


11
2017-11-01 02:09