web-dev-qa-db-fra.com

Changer le répertoire actuel à partir d'un script Bash

Est-il possible de changer le répertoire actuel à partir d'un script?

Je souhaite créer un utilitaire de navigation dans Bash. J'ai créé un script de test qui ressemble à ce qui suit:

#!/bin/bash
cd /home/artemb

Lorsque j'exécute le script à partir du shell Bash, le répertoire actuel ne change pas. Est-il possible de changer le répertoire Shell en cours à partir d'un script?

161
artemb

Vous devez convertir votre script en une fonction Shell:

#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
#   . ~/bin/myprog.sh
#

function myprog() {
  A=$1
  B=$2
  echo "aaa ${A} bbb ${B} ccc"
  cd /proc
}

La raison en est que chaque processus a son propre répertoire actuel et lorsque vous exécutez un programme à partir du shell, il est exécuté dans un nouveau processus. Les "cd", "pushd" et "popd" standard sont intégrés à l'interpréteur Shell afin qu'ils affectent le processus Shell.

En faisant de votre programme une fonction Shell, vous ajoutez votre propre commande in-process. Toute modification de répertoire est alors reflétée dans le processus Shell.

154
winden

Lorsque vous démarrez votre script, un nouveau processus est créé qui hérite uniquement de votre environnement. Quand ça se termine, ça se termine. Votre environnement actuel reste tel quel.

Au lieu de cela, vous pouvez démarrer votre script comme suit:

. myscript.sh

Le . évaluera le script dans l'environnement actuel, il pourrait donc être modifié

190
Norbert Hartl

Compte tenu de l’illisibilité et de la complication excessive des réponses, j’estime que le demandeur devrait faire 

  1. ajouter ce script à la PATH
  2. lancez le script en tant que . scriptname

Le . (point) s'assurera que le script n'est pas exécuté dans un shell enfant.

50
Albert

En réunissant ce qui précède, vous pouvez créer un alias.

alias your_cmd=". your_cmd"

si vous ne voulez pas écrire le début "." à chaque fois.vous voulez générer votre script dans l'environnement Shell, .__ ou si vous ne voulez simplement pas vous souvenir que cela doit être fait pour que le script fonctionne correctement.

36
MergerMan

Si vous utilisez bash, vous pouvez essayer alias:

dans le fichier .bashrc, ajoutez cette ligne:

alias p='cd /home/serdar/my_new_folder/path/'

lorsque vous écrivez "p" sur la ligne de commande, le répertoire sera modifié. 

30
akarca

Si vous exécutez un script bash, il fonctionnera sur son environnement actuel ou sur ceux de ses enfants, jamais sur le parent.

Si le but est d'exécuter votre commande:

#!/bin/bash
cd $1
exec bash

De cette façon, vous serez dans/home/test jusqu'à ce que vous quittiez (exit ou Ctrl + C) de ce Shell.

15
philippe lhardy

Avec pushd , le répertoire en cours est placé sur la pile de répertoires et est remplacé par le répertoire indiqué, popd obtient le répertoire situé en haut de la pile et y est modifié.

pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null
12
seb

Il suffit d'aller à 

yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor

et ajoutez ce code à côté de la dernière ligne: 

alias yourcommand="cd /the_path_you_wish"

Puis quittez l'éditeur.

Puis tapez: 

source ~/.bashrc or source ~/.bash_profile on MAC.

maintenant vous pouvez utiliser: yourcommand in terminal

4
ThangTD

Fondamentalement, nous utilisons cd.. pour revenir de chaque répertoire. J'ai pensé rendre la tâche plus facile en indiquant le nombre de répertoires avec lesquels vous devez revenir à la fois. Vous pouvez l'implémenter à l'aide d'un fichier de script séparé à l'aide de la commande alias. Par exemple:

code.sh

#!/bin/sh
 _backfunc(){
 if [ "$1" -eq 1 ]; then
  cd ..
 Elif [ "$1" -eq 2 ]; then
  cd ../..
 Elif [ "$1" -eq 3 ]; then
  cd ../../..
 Elif [ "$1" -eq 4 ]; then
  cd ../../../..
 Elif ["$1" -eq 10]; then
  cd /home/arun/Documents/work
 fi
 }
alias back='_backfunc'   

Après avoir utilisé source code.sh dans le shell actuel, vous pouvez utiliser:

$back 2 

pour revenir deux pas en arrière du répertoire courant. Expliqué en détail sur ici . Il est également expliqué ci-dessous comment insérer le code dans ~/.bashrc afin que chaque nouveau shell ouvert dispose automatiquement de cette nouvelle commande alias. Vous pouvez ajouter une nouvelle commande pour accéder à des répertoires spécifiques en modifiant le code en ajoutant plus de if conditions et différents arguments. Vous pouvez également extraire le code de git sur ici

3
Arun Chettoor

J'ai fait un script pour changer de répertoire. jetez un oeil: https://github.com/ygpark/dj

3
Joel

Cette approche est plus facile pour moi.

Supposons que sur un iMac personnel où vous êtes un administrateur, sous le répertoire par défaut lorsqu’une fenêtre de commande est ouverte,/Users/jdoe, ce sera le répertoire dans lequel vous souhaitez accéder: /Users/jdoe/Desktop/Mongo/db.3.2.1. /poubelle.

Ce sont les étapes qui peuvent faire le travail:

  1. vi mongobin, dans lequel j'ai entré: cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin comme première ligne.
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

Voila!

0
Daniel C. Deng

J'ai également créé un utilitaire appelé goat que vous pouvez utiliser pour faciliter la navigation.

Vous pouvez voir le code source sur GitHub .

À partir de v2.3.1 the aperçu de l'utilisation se présente comme suit:

# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev

# Follow a link to change a directory:
cd h4xdir

# Follow a link (and don't stop there!):
cd h4xdir/awesome-project

# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...

# List all your links:
goat list

# Delete a link (or more):
goat delete h4xdir lojban

# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents

# Delete all saved links:
goat nuke

# Delete broken links:
goat fix
0
Mateusz Piotrowski

J'aime faire la même chose pour différents projets sans avoir à lancer un nouveau Shell. 

Dans ton cas:

cd /home/artemb

Enregistrez le script sous:

echo cd /home/artemb

Puis lancez-le avec:

\`./the_script\`

Ensuite, vous accédez au répertoire en utilisant le même shell.

0
DrGamma

Déclarez votre chemin:

PATH='/home/artemb'     
cd ${PATH}
0
m_sam

Ajoutez ci-dessous la ligne cd dans votre shellcript ceci:

exec $Shell
0
Alberto Corella