66 votes

Pourquoi "cd" ne fonctionne pas dans un Shell Shell ?

Je veux juste écrire un script qui change mon répertoire .

J'ai mis les commandes suivantes dans le fichier /home/alex/pathABC

#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld

Je l'ai fait.

chmod +x pathABC

Dans le terminal, alors que dans /home/alex J'ai couru. ./pathABC mais la sortie est juste HelloWorld et le répertoire courant n'est pas modifié.

Alors, qu'est-ce qui ne va pas ?

100voto

John Virgolino Points 1231

Comme d'autres l'ont expliqué, le répertoire est modifié dans le processus enfant de votre script, et non dans le processus terminal à partir duquel le script est appelé. Après la mort du processus enfant, vous êtes de retour dans le terminal qui est laissé là où il était.

Plusieurs possibilités :

1. Lien symbolique

Mettez un lien symbolique dans votre maison vers le long chemin auquel vous voulez accéder facilement.

$ ln -s /home/alex/Documents/A/B/C ~/pathABC

puis accéder au répertoire avec :

$ cd ~/pathABC

2. Alias

Mettez un alias dans votre ~/.bashrc :

alias pathABC="cd /home/alex/Documents/A/B/C"

(de aquí )

3. Fonction

Créez une fonction qui change le répertoire, la fonction s'exécute dans le processus de votre terminal et peut alors changer son répertoire.

(de aquí )

4. Évitez de courir comme un enfant

Sourcez votre script au lieu de l'exécuter. Le sourcing (effectué par . o source ) fait en sorte que le script soit exécuté dans le même script au lieu de s'exécuter dans son propre sous-shell.

$ . ./pathABC

(de aquí y aquí )

5. Vars cd-able

Définissez le cdable_vars dans votre ~/.bashrc et créer une variable d'environnement dans le répertoire :

shopt -s cdable_vars
export pathABC="/home/alex/Documents/A/B/C"

Vous pouvez alors utiliser cd pathABC

(de aquí )

10voto

Deffjm Points 23

Lorsque vous exécutez script dans un Terminal, un processus enfant s'exécute. Dans ce programme enfant c'est à dire votre script changera vers le répertoire spécifié. Mais dans le processus parent, c'est à dire là où vous exécutez le script est toujours dans l'ancien chemin. OU simplement nous pouvons dire :

La portée de la commande cd est seulement pour le processus enfant et non le parent.

6voto

Jacob Vlijm Points 78990

Vous faites une erreur de raisonnement. Alors que le courant Shell reste dans le même répertoire, le script a été déplacé vers le nouveau répertoire.

Vous pouvez voir cela en créant un autre script dans le fichier nouveau et l'exécuter depuis votre script, après qu'il ait changé de répertoire :

#!/bin/sh
cd /home/alex/Documents/A/B/C && ./another_script.sh # (if it is executable)

Le deuxième script serait exécuté à partir du nouveau répertoire.

HelloWorld 

est juste la sortie du script.

5voto

En fait, je viens de trouver, après de nombreuses recherches, que si vous avez besoin de changer de répertoire, tout en gardant le même Shell, de sorte que vous obtiendrez toutes les réponses dans votre Shell actuel, vous pouvez utiliser :

(cd your_dir; do_some_command_there)

Par exemple, ce que j'avais besoin d'utiliser, c'était :

(cd your_dir; git remote -v | wc -l)

Fonctionne comme un charme !

1voto

Hetal Rachh Points 111

Essayer d'utiliser cd à l'intérieur du Shell ShellShellShell Shell s'exécute dans le sous-shell et une fois que le Shell est terminé, il retourne au Shell parent, c'est pourquoi le répertoire courant ne change pas.

Pour réaliser le changement de répertoire, utilisez le sourcing. . scriptname.sh o source scriptname.sh pour utiliser le sourcing.

Note : Lorsque vous utilisez le sourcing, n'utilisez pas non plus la commande exit car elle ferme alors votre connexion.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X