J'essaie d'écrire un petit script pour changer le répertoire courant en mon répertoire de projet:
#!/bin/bash
cd /home/tree/projects/java
J'ai enregistré ce fichier en tant que projet, ajouté une autorisation d'exécution avec chmod
et copié dans /usr/bin
. Quand je l'appelle par:,
proj
ça ne fait rien. Qu'est-ce que je fais mal?
pwd
sur la dernière ligne. Donc, avant la fin du script, vous pouvez vérifier si cela fonctionne ou non ..cd
La commande fonctionne bien à l'intérieur des scripts, essayez par vous-même.cd
situé?Réponses:
Les scripts shell sont exécutés à l'intérieur d'un sous-shell, et chaque sous-shell a son propre concept de ce qu'est le répertoire actuel. 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 change.Une façon de contourner ce problème consiste à utiliser un alias à la place:
la source
. my-script
ousource my-script
.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":
Mais je préfère la suggestion de Greg d'utiliser un alias dans ce cas simple.
la source
.
est également orthographiésource
, choisissez celui que vous trouvez le plus mémorable.Le
cd
dans votre script fonctionnait techniquement car il changeait le répertoire du shell qui exécutait le script, mais c'était un processus distinct issu de votre shell interactif.Un moyen compatible Posix pour résoudre ce problème consiste à définir une procédure shell plutôt qu'un script de commande appelé shell .
Vous pouvez simplement taper ceci ou le mettre dans l'un des différents fichiers de démarrage du shell.
la source
jhome(){ cd /home/tree/projects/$1; }
Le
cd
se fait dans le shell du script. Lorsque le script se termine, ce shell se ferme, puis vous vous retrouvez dans le répertoire où vous vous trouviez. "Source" le script, ne l'exécutez pas. Au lieu de:faire
(Remarquez le point et l'espace avant le nom du script.)
la source
source
myscript.sh
trouve dans un répertoire inclus dans $ PATH, vous pouvez le source de n'importe où sans spécifier le chemin complet.Pour créer un script bash qui sera cd dans un répertoire sélectionné:
Créer le fichier script
Créez ensuite un alias dans votre fichier de démarrage.
Par exemple, créez un fichier d'alias / fonctions principal: /scripts/mastercode.sh ( placez
l'alias dans ce fichier.)
Puis à la fin de votre fichier .bashrc :
Maintenant, c'est facile de cd dans votre répertoire java, tapez simplement cdjava et vous y êtes.
la source
mastercode.sh
n'a pas besoin de shabang (#!/bin/sh
), car il n'est pas (et ne peut pas être) exécuté dans un sous-shell. Mais en même temps, vous devez documenter la "saveur" du shell de ce fichier; par exemple, ksh ou bash (ou (t) csh / zsh, etc.), et ce n'est certainement pas le cassh
. J'ajoute habituellement un commentaire (mais pas le shebang) pour communiquer cela; par exemple, "ce fichier est censé provenir (de bash), ne pas être exécuté comme un script shell."source
d (via lealias
), ces variables vont s'infiltrer dans votre environnement shell. Pour éviter cela, faites tout le travail du script dans une fonction et appelez-la simplement à la fin du script. Dans la fonction, déclarez toutes les variableslocal
.Vous pouvez utiliser
.
pour exécuter un script dans l'environnement shell actuel:ou bien, son alias plus lisible mais spécifique au shell
source
:Cela évite le sous-shell, et permet à toutes les variables ou commandes (y compris
cd
) d'affecter le shell actuel à la place.la source
L'idée de Jeremy Ruten d'utiliser un lien symbolique a déclenché une pensée qui n'a croisé aucune autre réponse. Utilisation:
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:et, s'il n'y a pas de sous-répertoire appelé java dans le répertoire courant, alors il vous amènera directement à $ HOME / projects / java - pas d'alias, pas de scripts, pas d'execs douteux ou de commandes dot.
Mon $ HOME est / Users / jleffler; mon $ CDPATH est:
la source
Utilisation
exec bash
à la finCependant, cette question est souvent posée car on veut être laissé à une (nouvelle) invite bash dans un certain répertoire après l'exécution d'un script bash à partir d'un autre répertoire.
Si tel est le cas, exécutez simplement une instance bash enfant à la fin du script:
la source
exit
vous revenez au shell où vous avez exécuté ce script.J'ai fait fonctionner mon code en utilisant
. <your file name>
./<your file name>
dose ne fonctionne pas car il ne modifie pas votre répertoire dans le terminal, il modifie simplement le répertoire spécifique à ce script.Voici mon programme
Voici mon terminal
la source
. something
et./something
?? Cette réponse a fonctionné pour moi et je ne comprends pas pourquoi.. something
vous permet d'exécuter le script à partir de n'importe quel emplacement,./something
vous oblige à être dans le répertoire dans#!. /bin/bash
?exécutez simplement:
la source
Lorsque vous lancez un script shell, il exécute une nouvelle instance de ce shell (
/bin/bash
). Ainsi, votre script lance simplement un shell, change le répertoire et quitte. Autrement dit,cd
(et d'autres commandes de ce type) dans un script shell n'affectent ni n'ont accès au shell à partir duquel elles ont été lancées.la source
Dans mon cas particulier, j'avais besoin de trop de fois pour changer pour le même répertoire. Donc sur mon .bashrc (j'utilise ubuntu) j'ai ajouté le
1 -
2-
3 -
Directement, cela fera: cd / home / tree / projects / java
J'espère que cela pourra aider!
la source
Vous pouvez faire ce qui suit:
EDIT: Cela pourrait également être «pointillé», pour empêcher la création de coques ultérieures.
Exemple:
la source
exit
(ou ctrl + d) plusieurs fois pour quitter le shell, par exemple .. Un alias est tellement plus propre (même si la commande shell génère un répertoire, et qu'il est cd à la sortie - quelque chose d'alias = "cdgetnewdirectory.sh
")Il ne change que le répertoire du script lui-même, tandis que votre répertoire actuel reste le même.
Vous voudrez peut-être utiliser un lien symbolique à la place. Il vous permet de créer un "raccourci" vers un fichier ou un répertoire, vous n'avez donc qu'à taper quelque chose comme
cd my-project
.la source
Vous pouvez combiner les approches d'alias et de points d'Adam et Greg pour créer quelque chose de plus dynamique ...
Maintenant, l'exécution de l'alias du projet exécutera le script du projet dans le shell actuel par opposition au sous-shell.
la source
Vous pouvez combiner un alias et un script,
à condition que le script fasse écho au chemin de destination. Notez que ce sont des backticks entourant le nom du script.
Par exemple, votre script pourrait être
L'avantage de cette technique est que le script peut prendre n'importe quel nombre de paramètres de ligne de commande et émettre différentes destinations calculées par une logique éventuellement complexe.
la source
proj() { cd "/home/user/projects/java/$1"; }
=>proj "foo"
(ou,proj "foo bar"
<= dans le cas où vous avez des espaces) ... ou même (par exemple):proj() { cd "/home/user/projects/java/$1"; shift; for d; do cd "$d"; done; }
=>proj a b c
=> fait uncd
into/home/user/projects/java/a/b/c
pour naviguer rapidement dans les répertoires, il y a $ CDPATH, cdargs et des façons de générer automatiquement des alias
http://jackndempsey.blogspot.com/2008/07/cdargs.html
http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5827311.html
la source
Dans votre fichier ~ / .bash_profile. ajouter la fonction suivante
Redémarrez le terminal et vous pouvez taper
et vous serez déplacé vers le dossier de destination.
la source
Vous pouvez utiliser l'opérateur &&:
cd myDirectory && ls
la source
&&
si vous voulez que la seconde soit conditionnelle à la première, ou simplement avec;
ou une nouvelle ligne entre elles) mais le mettre dans un script vous ramènera à "pourquoi le shell parent n'utilise-t-il pas le nouveau répertoire lorsque lecd
a réussi? "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.
Cette technique est utilisée par autojump: http://github.com/joelthelion/autojump/wiki pour vous fournir des signets d'apprentissage dans le répertoire shell.
la source
Vous pouvez créer une fonction comme ci-dessous dans votre
.bash_profile
et cela fonctionnera sans problème.La fonction suivante prend un paramètre facultatif qui est un projet. Par exemple, vous pouvez simplement exécuter
ou
Voici la définition de la fonction.
N'oubliez pas de vous procurer votre
.bash_profile
la source
Cela devrait faire ce que vous voulez. Accédez au répertoire d'intérêt (à partir du script), puis générez un nouveau shell bash.
Si vous l'exécutez, il vous amènera au répertoire d'intérêt et lorsque vous le quitterez, il vous ramènera à l'emplacement d'origine.
Cela vous ramènera même à votre répertoire d'origine lorsque vous quitterez ( CTRL+ d)
la source
LOOOOOng après, mais j'ai fait ce qui suit:
créer un fichier appelé case
collez ce qui suit dans le fichier:
enregistrez-le puis:
J'ai également créé un alias dans mon
.bashrc
:maintenant quand je tape:
essentiellement je tape:
Vous pouvez taper n'importe quel dossier après «case»:
ce qui revient à taper:
respectivement
Dans mon cas, le chemin est beaucoup plus long - ces gars-là l'ont résumé avec les ~ info plus tôt.
la source
cd
dans l'alias est superflu et inélégant; l'alias devrait simplement '. ~ / case` à la place. Est égalementcase
un mot clé réservé, donc un choix plutôt mauvais pour un nom.Vous n'avez besoin d'aucun script, définissez uniquement l'option correcte et créez une variable d'environnement.
dans votre
~/.bashrc
permet aucd
contenu des variables d'environnement.Créez une telle variable d'environnement:
et vous pouvez utiliser:
D'autres alternatives .
la source
Si vous utilisez du poisson comme coquille, la meilleure solution est de créer une fonction. À titre d'exemple, compte tenu de la question d'origine, vous pouvez copier les 4 lignes ci-dessous et les coller dans votre ligne de commande poisson:
Cela créera la fonction et l'enregistrera pour une utilisation ultérieure. Si votre projet change, répétez simplement le processus en utilisant le nouveau chemin.
Si vous préférez, vous pouvez ajouter manuellement le fichier de fonction en procédant comme suit:
et entrez le texte:
et enfin appuyez sur ctrl + x pour quitter et y suivi de retour pour enregistrer vos modifications.
( REMARQUE: la première méthode d'utilisation de funcsave crée le fichier proj.fish pour vous ).
la source
J'ai un simple script bash appelé p pour gérer le changement de répertoire sur
github.com/godzilla/bash-stuff il
suffit de mettre le script dans votre répertoire bin local (/ usr / local / bin)
et de mettre
dans votre .bashrc
la source
Notez la discussion Comment définir le répertoire de travail du processus parent?
Il contient des réponses piratées, par exemple https://stackoverflow.com/a/2375174/755804 (modification du répertoire de processus parent via gdb, ne faites pas cela) et https://stackoverflow.com/a/51985735/755804 ( la commande
tailcd
qui injecte cd dirname dans le flux d'entrée du processus parent; eh bien, idéalement, cela devrait être une partie de bash plutôt qu'un hack)la source
C'est une vieille question, mais je suis vraiment surpris de ne pas voir cette astuce ici
Au lieu d'utiliser un CD, vous pouvez utiliser
Pas besoin de créer de sous-shell ou d'utiliser des alias.
Notez qu'il est de votre responsabilité de vous assurer que le / chemin / vous / voulez existe.
la source
Comme expliqué dans les autres réponses, vous avez modifié le répertoire, mais uniquement dans le sous-shell qui exécute le script . cela n'a pas d'impact sur le shell parent.
Une solution consiste à utiliser les fonctions bash au lieu d'un script bash (
sh
); en plaçant votre code de script bash dans une fonction. Cela rend la fonction disponible en tant que commande et ensuite, cela sera exécuté sans processus enfant et donc toutecd
commande aura un impact sur le shell de l'appelant.Fonctions bash:
Une caractéristique du profil bash est de stocker des fonctions personnalisées qui peuvent être exécutées dans le terminal ou dans des scripts bash de la même manière que vous exécutez des applications / commandes, cela pourrait également être utilisé comme raccourci pour de longues commandes.
Pour que votre système fonctionne efficacement, vous devrez copier votre fonction à la fin de plusieurs fichiers
Vous pouvez
sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profile
modifier / créer ces fichiers rapidementComment :
Copiez le code de votre script bash dans une nouvelle fonction à la fin du fichier de profil de votre bash et redémarrez votre terminal, vous pouvez ensuite exécuter
cdd
ou quelle que soit la fonction que vous avez écrite.Exemple de script
Faire un raccourci
cd ..
aveccdd
raccourci ls
raccourci ls
la source
Vous pouvez exécuter certaines lignes dans le même sous-shell si vous terminez les lignes avec une barre oblique inverse.
la source