Je veux exécuter un script pour simplement changer le répertoire de travail courant:
#!/bin/bash cd web/www/project
Mais, après lavoir exécuté, le pwd actuel reste inchangé! Comment puis-je faire cela?
Réponse
Cest un comportement attendu. 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 de façon permanente le répertoire du shell courant, vous devez utiliser la commande source
, également aliasée simplement comme .
, qui exécute un script dans lenvironnement shell actuel au lieu dun sous-shell.
Les commandes suivantes sont identiques:
. script
ou
source script
Commentaires
Answer
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 devriez lajouter à votre .bashrc
, si vous voulez quil soit défini pour chaque shell interactif.
Vous pouvez maintenant lexécuter en tant que $ cdproj
.
Commentaires
- Vous pouvez également demander au script de faire écho aux commandes à exécuter, puis utiliser
eval `./script`
oueval $(./script)
pour exécuter ces commandes. Cest une approche courante pour les commandes qui ont besoin de mettre à jour lenvironnement du shell appelant ‘. - Faites très attention à ce que vous sortez si vous allez y aller lapproche
eval
.
Réponse
Utilisez 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 car on veut être laissé au bash invite dans un certain répertoire après lexécution dun script bash dun 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
Ceci crée un nouveau sous-shell. Tapez Ctrl + D ou exit
pour revenir au premier shell où le script a été initialement lancé.
Mettre à jour
Au moins avec les versions plus récentes de bash
, le exec
sur la dernière ligne nest plus nécessaire. De plus, le script peut fonctionner avec nimporte quel shell préféré en utilisant la variable denvironnement $SHELL
. Cela donne alors:
#!/usr/bin/env bash cd desired/directory $SHELL
Commentaires
- Mieux vaut simplement rechercher le script, comme dans la réponse acceptée : lutilisation de
exec
est généralement considérée comme le dernier recours dun scélérat .. 🙂 - cette astuce ne ‘ t travailler dans debian 9 stretch.
- Ce nest pas la bonne façon de procéder!
- Puisque personne na détaillé les problèmes avec ceci (je vous regarde, @Dennis): (1) Chaque fois que vous exécutez ceci, cela crée un nouveau processus de bash persistant. Faites-le dix ou vingt fois dans une session, et vous aurez 11 à 21 processus de bash empilés. Cela peut affecter les performances et, si vous essayez de terminer proprement la session en tapant
exit
(ou Ctrl + D), vous devrez le faire 11 à 21 fois. (2) Un autre inconvénient de lutilisation dun script exécutable est que, si vous définissez des options de shell (par exemple,dotglob
ouglobstar
) dans votre session shell interactive, vous les perdrez, car vous démarrez un nouveau shell. - Très belle solution! Jai ‘ réécrit mon alias dans bash_profile, donc maintenant cest un script stocké dans un fichier séparé. Jutilise le script pour accéder à un dossier temporaire nouvellement créé. Et maintenant, il est encore plus facile davoir une session de bash temporaire. SRP en action! Merci!
Réponse
Bien quil y ait des réponses qui font exactement laction que vous voulez, une méthode plus standard pour un tel le but est de créer un lien symbolique:
ln -s ~/web/www/project proj #use full path to dir!
Ensuite, vous pourriez cd
vers 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
Réponse
Dépend de ce que vous « allez faire, une autre solution peut être de créer une fonction au lieu dun script.
Exemple:
Créer une fonction dans un fichier, disons /home/aidin/my-cd-script
:
function my-cd() { cd /to/my/path }
Ensuite, incluez-le dans votre bashrc
ou zshrc
fichier:
# Somewhere in rc file source /home/aidin/my-cd-script
Vous pouvez maintenant lutiliser comme une commande:
$ my-cd
Réponse
Si vous changez de répertoire éloigné dans le système de fichiers. Je recommanderai autojump .
Réponse
Pour moi, lapproche la plus pratique et la plus flexible était un mélange dalias et de script:
créer un script avec une logique arbitraire
Ici, je crée un script qui change dans un répertoire et active lenvironnement python approprié. Lemplacement des scripts est indiqué dans /path/to/workon_myproj.sh
.
#!/usr/bin/env bash cd $HOME/workspace/myproj source .venv/bin/activate
créer un alias qui génère le script
alias workon_myproj="source /path/to/workon_myproj.sh"
Ajoutez la définition dalias dans votre fichier de démarrage shell approprié, par exemple .profile
, .bashrc
ou .zshrc
.
résultat
Vous pouvez maintenant simplement exécuter workon_myproj
dans un shell qui source le contenu de votre script dans le répertoire souhaité.
extensibilité
Vous pouvez éventuellement améliorer votre script pour prendre un argument afin quil 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 sur … tout ce que vous faites lorsque vous continuez à travailler sur un projet spécifique.
Réponse
Pourquoi ne pas utiliser » exec « il semble faire exactement ce que je souhaite.
#!/bin/bash cd someplace exec bash ~/someplace
Commentaires
- Attention aux choses qui semble être ce que vous voulez. (Un cheval de bois géant! Juste ce que je voulais!) Chaque fois que vous exécutez ceci, cela crée un nouveau processus de bash persistant. Faites-le dix ou vingt fois dans une session, et vous aurez 11 à 21 processus de bash empilés. Cela peut affecter les performances et, si vous essayez de terminer la session proprement en tapant
exit
(ou Ctrl + D), vous devrez le faire 11 à 21 fois. - Je pourrais certainement voir où ce serait un problème. Pour moi, bien que je ‘ m lutilisant une fois, en faisant le travail dont jai besoin, puis en quittant. Si cela ‘ est le seul inconvénient peut vivre avec ça. En revanche, sil y a une meilleure solution, je ‘ suis prêt à lexaminer.
- La réponse dAidin à cette question , en utilisant une fonction shell, et la la réponse de Sachin Divekar , en utilisant un alias, sont (IMO) de meilleures solutions que lutilisation dun script . P.S. Un autre inconvénient de lutilisation dun script est que, si vous définissez des options du shell (par exemple,
dotglob
ouglobstar
), vous les perdrez, parce que vous démarrez un nouveau shell. … (Suite) - (suite)… P.P.S. Je viens de remarquer que vous répétez, en gros, la réponse de Serge Stroobandt et dites «Pourquoi ne pas faire ça?» À Stack Exchange , nous nous attendons à ce que les réponses apportent de nouvelles idées et / ou informations, et pas seulement à discuter dautres réponses.
Réponse
Ceci combine la réponse de Serge avec une réponse indépendante de David . Il change de répertoire, puis au lieu de forcer un shell bash, il lance le shell par défaut de lutilisateur . Il nécessite cependant getent
et /etc/passwd
pour détecter le shell par défaut.
#!/usr/bin/env bash cd desired/directory USER_SHELL=$(getent passwd <USER> | cut -d : -f 7) $USER_SHELL
Bien sûr, cela présente toujours le même défaut de création dun shell imbriqué.
Réponse
Vous pouvez le faire en utilisant une fonction ou en utilisant & & Les exemples ci-dessous installe Zabbix et crée un fichier avec une ligne à lintérieur.
Ex:
#!/bin/bash # Create Function: installZabbix(){ cd /usr/src/zabbix-4.2.4; ./configure --enable-agent; make install; cd /usr/src/; >file; echo "Hi, this is a file." >>file; } # Call the function: installZabbix
ou:
#!/bin/bash cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
pour échapper à un script provenant de cette manière, et nonexit
– ils sont comme des fonctions shell etexit
quittera le shell qui a généré le script.source ./script
identique?.
etsource
sont égaux en bash. 2. Nous ne ‘ t besoin dutiliser./
avant le nom de fichier si ‘ est dans le même répertoire. Vous pouvez exécuter uniquement ceci:. script