Je veux juste écrire un script qui change mon répertoire .
Je mets les commandes ci-dessous dans le fichier /home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
J'ai fait chmod +x pathABC
.
Dans le terminal, pendant que /home/alex
je suis, je cours ./pathABC
, mais la sortie est juste HelloWorld
et le répertoire actuel n’est pas changé.
Alors qu'est-ce qui ne va pas?
command-line
scripts
gnome-terminal
Mohammad Reza Rezwani
la source
la source
Réponses:
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é. Une fois que le processus enfant est mort, vous êtes de retour dans le terminal qui est laissé où il était.
Plusieurs alternatives:
1. Lien symbolique
Mettez un lien symbolique dans votre maison vers le long chemin auquel vous souhaitez accéder facilement
puis accédez au répertoire avec:
2. alias
Mettez un alias dans votre ~ / .bashrc:
(à partir d' ici )
3. fonction
Créez une fonction qui modifie le répertoire, la fonction s'exécute dans le processus de votre terminal et peut ensuite changer de répertoire.
(à partir d' ici )
4. Évitez de courir comme un enfant
Source votre script au lieu de l'exécuter. La détermination de source (effectuée par
.
ousource
) entraîne l'exécution du script dans le même shell au lieu de s'exécuter dans son propre sous-shell.(d' ici et d' ici )
5. cd -able vars
Définissez l'
cdable_vars
option dans votre~/.bashrc
et créez une variable d'environnement dans le répertoire:Ensuite, vous pouvez utiliser
cd pathABC
(à partir d' ici )
la source
source
! Je me suis toujours demandé pourquoisource .bashrc
et pasbash .bashrc
cd $pathABC
?Lorsque vous exécutez un script dans un terminal, un processus enfant s'exécute. Dans ce programme enfant, votre script passera dans le répertoire spécifié. Mais dans le processus parent, c’est-à-dire que vous exécutez le script qui est toujours dans l’ancien chemin. OU simplement nous pouvons dire:
The scope of cd command is only for child process not parent
la source
. pathABC
ousource pathABC
.Vous faites une erreur de pensée. Bien que le shell actuel reste dans le même répertoire, le script a été déplacé dans le nouveau répertoire.
Vous pouvez le constater en créant un autre script dans le nouveau répertoire et en l'exécutant à partir de votre script, une fois le répertoire changé:
Le second script serait exécuté à partir du nouveau répertoire.
est juste la sortie du script.
la source
pwd
dans le nouveau répertoire, au lieu d’ajouter un tout nouveau script à la situation.Parce que hello world est juste une déclaration de trace, essayons ceci:
Créer un fichier de script bash
cd.sh
contenant:.sh
extension est une convention plus ancienne qui consiste à donner une extension aux noms de fichiers de script bash. C'est purement esthétique et généralement inutile. Cependant, dans ce cas, il est important de faire la différence avec lacd
commande principale .Marquez le fichier de script bash comme exécutable en utilisant:
Maintenant, lancez le fichier:
cd
nous savons tous.$(...)
exécute la commande entre parenthèses et renvoie la sortie.cd.sh
était dans votre chemin, vous n'avez pas besoin de spécifier où il se trouve. Nous préfixons avec./
pour spécifier que la commande est dans le répertoire en cours.echo
sortie ducd.sh
script est renvoyée au parent via le fichier$(...)
. Le parent (notre invite shell) utilise cette sortie et le transmet à lacd
commande Linux .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ù aller après la fin du processus.
la source
14.04
version que j'ai lue il y a environ une heure?cd /home/mike/Documents/A/B/C
qui ne produisait aucune sortie. Maintenant, c'estecho "/home/mike/Documents/A/B/C"
ce qui produit une sortie../cd.sh
c'est maintenant,cd $(./cd.sh)
mais l'objectif est de permettre à l'enfant de changer le répertoire actuel du parent. Oui, ce n'est pas conventionnel, mais c'est une autre façon de le faire que j'espère que les gens trouveront intéressante.