changer le répertoire de travail actuel avec un script

8

J'ai lu cette question et sa réponse, mais cela ne correspond pas à mon problème, même si c'est similaire.

J'écris un script (appelé cpj) qui lancera l'un de mes projets en cours. J'en ai environ 5. Quand je tape

$ cpj blah

Je veux que le répertoire de travail actuel se transforme en répertoire de projet blah (que je tiens dans $ PROJDIR) et je veux qu'emacsclient ouvre le fichier principal de ce projet (que je tiens dans $ MAINFILE).

La question que j'ai citée dit que vous ne pouvez pas changer directement l'environnement du shell exécutant le script, mais vous pouvez source un script et il le fera.

Pour tester cela, j'ai écrit un script shell (appelé chcwd) qui a une ligne:

cd $1

Si, à partir de la ligne de commande, je fais:

$ . chcwd $PROJDIR

mon répertoire de travail actuel changera comme je le souhaite. Si, en revanche, à partir de mon script cpj, j'ai la même ligne:

. chcwd $PROJECT

cela ne changera pas le répertoire de travail actuel du shell. Je me rends compte que j'exécute 2 scripts (cpj puis chcwd), et donc que je crée 2 shells, mais je ne vois aucun moyen de faire ce que je veux. Quelqu'un peut-il me montrer comment atteindre mon objectif?

bev
la source

Réponses:

11

Vous ne pouvez pas avoir votre gâteau et le manger aussi. Les deux choses qui se produisent ici sont l'exécution d'un script dans un nouveau shell et l'importation de lignes de script à exécuter dans le shell actuel. En utilisant l'opérateur point (qui est un alias pour la sourcecommande), vous exécutez réellement le code dans votre shell actuel . Si votre code le souhaite cd, une fois terminé, vous serez laissé dans le nouveau répertoire.

Si par contre vous souhaitez exécuter un programme (ou un script, cela n'a pas d'importance), ce programme sera lancé en tant que sous-processus. Dans le cas des scripts shell, un nouveau shell sera ouvert et le code y sera exécuté. Toute cdaction entreprise modifiera le répertoire de travail actuel de ce shell, effectif pour toutes les commandes à suivre. Une fois le travail terminé, le shell se termine, vous laissant dans votre shell d'origine (et non modifié).

Si c'est quelque chose que vous utilisez beaucoup et que vous voulez que ses effets soient laissés dans votre shell actuel, vous pouvez peut-être écrire votre "script" en tant que fonction shell à la place et l'enregistrer dans votre ~ / .profile ou autre fichier shell rc.

function cpj() {
    # code here
    cd /path/$1
    emacs file_name
}
Caleb
la source
Caleb, merci pour votre contribution. J'aime ton jeu de mots. Votre premier paragraphe reprend admirablement ce que j'ai dit dans ma question. Votre deuxième paragraphe reprend assez bien ce qui a été dit dans la question que j'ai citée. Votre troisième paragraphe est exactement et précisément ce que je cherchais! Merci mec.
bev
2

J'ai un script similaire écrit pour mon usage personnel. Il existe une astuce très simple pour modifier le répertoire de travail dans un script. Écrivez d'abord votre script, in.ex .:

#!/bin/bash

case $1 in
     project1) cd /home/me/work/customer1/project1
     ;;
     project2) cd /home/me/work/customer2/project1
     ;;
     project3) cd /home/me/work/customer3/project2
     ;;
     project4) cd /home/me/work/customer4/project5
     ;;
     *) echo "Usage: cdto cd_profile_name"
     ;;
esac

Supposons maintenant que le script s'appelle «cdto». Pour le faire fonctionner, vous devez le source dans le shell actuel, ce qui peut être réalisé par «source» ou «.» (les deux sont identiques). En ex.:

. cdto project1

Maintenant, pour le rendre plus pratique:

  1. Copiez le script 'cdto' dans un répertoire 'bin' de votre compte (dans ex. / Home / johnsmith / bin - créez-le s'il n'existe pas). Vérifiez votre variable PATH pour vous assurer que le répertoire «bin» est inclus:

    echo $ PATH

Sinon, modifiez votre fichier .profile et ajoutez:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
  1. Ajoutez un alias à votre fichier .bashrc ou .bash_aliases:

    alias cdto = '. cdto '

Et c'est fait. Après la prochaine connexion ou lorsque vous ouvrez un nouveau terminal, vous pouvez simplement utiliser in.ex .:

cdto project1

Prendre plaisir :-)

Sebastian Piech

Sebastian Piech
la source
0

Une astuce simple pour ce faire:

pushd $PROJDIR && bash

Maintenant, le répertoire de travail est $ PROJECT.

artificerpi
la source