web-dev-qa-db-fra.com

Script pour changer le répertoire courant (cd, pwd)

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?

56
Sony Santos

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
76
enzotib

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.

27
Sachin Divekar

Utilisation exec bash à la fin

Un 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é.

14
Serge Stroobandt

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
8
corvinus

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
5
Aidin

Si vous changez de répertoire loin dans le système de fichiers. Je recommanderai autojump .

4
stnly

Écrivez simplement dans PWD et exportez-le dans votre script, et le changement persistera.

export PWD=/your/desired/directory
1
Samha'

Pour moi, l'approche la plus pratique et la plus flexible était un mélange d'alias et de script:

créer un script avec une logique arbitraire

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

créer un alias qui source le script

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.

résultat

Vous pouvez maintenant simplement exécuter workon_myproj dans un Shell qui fournira le contenu de votre script dans le répertoire souhaité.

extensibilité

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.

0
Jan

Pourquoi ne pas utiliser "exec" il sert à faire exactement ce que je souhaite.

#!/bin/bash

cd someplace
exec bash

~/someplace
0
paul