Je veux exécuter un script pour simplement changer le répertoire de travail actuel:
#!/bin/bash
cd web/www/project
Mais, après l'avoir exécuté, la marche avant actuelle reste inchangée! Comment puis je faire ça?
C'est un comportement attendu, et déjà discuté plusieurs fois.
Le script est exécuté dans un sous-shell et ne peut pas modifier le répertoire de travail du shell parent. Ses effets sont perdus à la fin.
Pour changer définitivement de répertoire, vous devez source le script, comme dans
. ./script
Pour de petites tâches comme celle-ci, au lieu de créer un script, créez un alias comme celui-ci,
$ alias cdproj='cd /dir/web/www/proj'
Vous devez l'ajouter à votre .bashrc
fichier, si vous voulez qu'il soit défini pour chaque shell interactif.
Vous pouvez maintenant l'exécuter en tant que $ cdproj
.
exec bash
à la finUn script bash opère sur son environnement actuel ou sur celui de ses enfants, mais jamais sur son environnement parent.
Cependant, cette question est souvent posée parce que l'on veut être laissé à l'invite bash dans un certain répertoire après l'exécution d'un script bash d'un autre répertoire.
Si tel est le cas, exécutez simplement une instance bash enfant à la fin du script:
#!/usr/bin/env bash
cd desired/directory
exec bash
Cela crée un nouveau sous-shell. Tapez exit
pour revenir au premier Shell où le script a été initialement démarré.
Bien qu'il existe des réponses qui effectuent l'action exacte que vous souhaitez, une méthode plus standard à cet effet consiste à créer un lien symbolique:
ln -s ~/web/www/project proj #use full path to dir!
Vous pouvez alors cd
dans le répertoire en utilisant le nom proj
:
cd proj
Cette méthode est plus flexible car vous pouvez accéder aux fichiers en utilisant le nom court sans cd
:
ls proj/ #note the endslash!
vim proj/file.x
Selon ce que vous allez faire, une autre solution peut être de créer une fonction au lieu d'un script.
Exemple:
Créez une fonction dans un fichier, disons /home/aidin/my-cd-script
:
function my-cd() {
cd /to/my/path
}
Incluez-le ensuite dans votre fichier bashrc
ou zshrc
:
# Somewhere in rc file
source /home/aidin/my-cd-script
Vous pouvez maintenant l'utiliser comme une commande:
$ my-cd
Si vous changez de répertoire loin dans le système de fichiers. Je recommanderai autojump .
Écrivez simplement dans PWD
et exportez-le dans votre script, et le changement persistera.
export PWD=/your/desired/directory
Pour moi, l'approche la plus pratique et la plus flexible était un mélange d'alias et de script:
Ici, je crée un script qui se transforme en répertoire et active l'environnement python approprié. L'emplacement des scripts est exemplaire dans /path/to/workon_myproj.sh
.
#!/usr/bin/env bash
cd $HOME/workspace/myproj
source .venv/bin/activate
alias workon_myproj='source /path/to/workon_myproj.sh'
Ajoutez la définition d'alias dans votre fichier de démarrage Shell approprié, par ex. .profile
, .bashrc
ou .zshrc
.
Vous pouvez maintenant simplement exécuter workon_myproj
dans un Shell qui fournira le contenu de votre script dans le répertoire souhaité.
Vous pouvez améliorer votre script pour prendre un argument afin qu'il fonctionne avec plusieurs projets dans un répertoire de travail spécifique, ou le combiner avec un git pull
pour obtenir les dernières modifications immédiatement et ainsi de suite ... tout ce que vous faites sur les plaques de chaudière lorsque vous continuez à travailler sur un projet spécifique.
Pourquoi ne pas utiliser "exec" il sert à faire exactement ce que je souhaite.
#!/bin/bash
cd someplace
exec bash
~/someplace