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

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

  • @Sony: Notez que vous devez utiliser return pour échapper à un script provenant de cette manière, et non exit – ils sont comme des fonctions shell et exit quittera le shell qui a généré le script.
  • @CharlesStewart En fait, je ‘ ne suis pas familier avec les scripts dorigine. Merci!
  • est source ./script identique?
  • @amyassin: oui, cest
  • 1. . et source 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

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` ou eval $(./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 ou globstar) 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 ou globstar), 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 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *