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 ?

1voto

Serge Stroobandt Points 3924

Utilice $SHELL à la fin

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

Cependant, cette question est souvent posée parce que l'on veut à laisser à l'invite de commande dans un certain répertoire après exécution d'un script à partir d'un autre répertoire.

Si c'est le cas, il suffit de exécuter un enfant $SHELL instance à la fin du script :

# !/usr/bin/env bash
cd /home/alex/Documents/A/B/C
echo -e '\nHit [Ctrl]+[D] to exit this child shell.'
$SHELL

Pour revenir à l'instance précédente, l'instance parentale Shell, utilisez Ctrl + D .

0voto

WinEunuuchs2Unix Points 91128

Puisque hello world est juste une déclaration de trace, essayons ceci :

Créer le fichier script de bash cd.sh contenant :

#!/bin/bash
echo "/home/mike/Documents/A/B/C"
  • En .sh L'extension est une ancienne convention consistant à donner aux noms de fichiers bash script une extension. C'est purement cosmétique et généralement inutile. Cependant, dans ce cas, il est important de la différencier de l'extension de base. cd commandement.

Marquer le fichier bash script exécutable en utilisant :

chmod a+x cd.sh

Maintenant, exécutez le fichier :

$ cd $(./cd.sh)
bash: cd: /home/alex/Documents/A/B/C: No such file or directory
  • cd que nous connaissons tous.
  • $(...) exécute la commande entre parenthèses et renvoie la sortie.
  • Si cd.sh était dans votre chemin, vous n'avez pas besoin de préciser où il se trouve. Nous préfixons avec ./ pour spécifier que la commande se trouve dans le répertoire courant.
  • En echo sortie de la cd.sh script est renvoyée au parent par l'intermédiaire de la balise $(...) . Le parent (notre invite Shell) utilise cette sortie et la transmet au système Linux cd commandement.

Comme d'autres l'ont mentionné, un processus enfant ne peut pas changer le répertoire du parent. C'est une façon pour l'enfant de dire au parent où il doit aller après la fin du processus.

0voto

BadChimp Points 1

CDPATH pourrait aider dans certains cas.

# add this to .bashrc .zshrc or whatever
export CDPATH="/home/alex/Documents/A/B:$CDPATH"

# and then you can just do...
cd C

Notez que vous devez ajouter 'A/B' à CDPATH, et non 'A/B/C'. Vous pouvez ajouter plusieurs chemins à CDPATH, tout comme PATH.

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