Question

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

Je veux créer un utilitaire pour la navigation du répertoire dans Bash. J'ai créé un script de test qui ressemble à ce qui suit:

#!/bin/bash
cd /home/artemb

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

Était-ce utile?

La solution

Vous devez convertir votre script à 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 est que chaque processus a son propre répertoire courant, et lorsque vous exécutez un programme à partir du shell, il est exécuté dans un nouveau processus. La norme « cd », « pushd » et « popd » sont builtin à l'interpréteur de commandes afin qu'ils affectent le processus shell.

En rendant votre programme une fonction shell, vous ajoutez votre commande en cours et tout changement de répertoire gets apparaissent dans le processus shell.

Autres conseils

Lorsque vous démarrez votre script, un nouveau processus est créé que seul hérite votre environnement. Quand il se termine, il se termine. Votre environnement actuel reste tel qu'il est.

Au lieu de cela, vous pouvez commencer votre script comme ceci:

. myscript.sh

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

À la lumière de l'illisibilité et overcomplication des réponses, je crois que c'est ce que le demandeur doit faire

  1. ajouter ce script à la PATH
  2. exécuter le script comme . scriptname

Le . (dot) fera que le script est exécuté pas dans une coquille d'enfant.

Mettre l'ensemble ci-dessus, vous pouvez créer un alias

alias your_cmd=". your_cmd"

si vous ne voulez pas écrire le leader « » chaque fois vous voulez la source de votre script à l'environnement shell, ou si vous ne voulez pas simplement de se rappeler qu'il faut faire pour que le script fonctionne correctement.

Si vous utilisez bash, vous pouvez essayer alias:

dans le fichier .bashrc ajouter cette ligne:

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

lorsque vous écrivez « p » sur la ligne de commande, il va changer le répertoire.

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

Si but est d'exécuter votre commande: goto.sh / home / test Travaillez ensuite de manière interactive dans / home / test d'une façon est d'exécuter un bash sous-shell interactif au sein de votre script:

#!/bin/bash
cd $1
exec bash

De cette façon, vous serez dans / home / test jusqu'à la sortie (sortie ou Ctrl + C) de cette coquille.

pushd le répertoire courant est poussé sur la pile de répertoire et il est modifié dans le répertoire donné, popd obtenir le répertoire sur le dessus de la pile et passe ensuite à il.

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

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.

Ensuite, tapez:

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

vous pouvez utiliser: yourcommand dans le terminal

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

En gros, nous utilisons cd.. pour revenir de tous les répertoires. Je pensais que pour le rendre plus facile en donnant le nombre de répertoires dont vous avez besoin de revenir à la fois. Vous pouvez mettre en œuvre cette aide d'un fichier de script distinct en utilisant 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 en cours, vous pouvez utiliser:

$back 2 

à venir deux pas en arrière à partir du répertoire courant. Expliqué en détail sur . Il est également expliqué là-bas comment mettre le code dans ~ / .bashrc afin que chaque nouveau shell ouvert aura automatiquement cette nouvelle commande alias. Vous pouvez ajouter une nouvelle commande pour aller à des répertoires spécifiques en modifiant le code en ajoutant plus if conditions et différents arguments. Vous pouvez également tirer le code de git sur .

Cette approche est plus facile pour moi.

Supposons que sur un iMac personnel dans lequel 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 pour aller à: / Users / jdoe / Desktop / Mongo / db. 3.2.1 / bin.

Ce sont les étapes qui peuvent avoir le travail:

  1. vi mongobin, où je suis entré dans: cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin la première ligne.
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

Voila!

J'ai aussi créé un utilitaire appelé chèvre que vous pouvez utiliser pour faciliter la navigation.

Vous pouvez afficher le code source sur GitHub .

Au v2.3.1 Présentation de l'utilisation ressemble à ceci:

# 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

J'aime faire la même chose pour différents projets sans tirer un nouveau shell.

Dans votre cas:

cd /home/artemb

Enregistrer the_script comme:

echo cd /home/artemb

Ensuite, le feu avec:

\`./the_script\`

Ensuite, vous obtenez le répertoire en utilisant la même shell.

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

exec $SHELL

Déclarer votre chemin:

PATH='/home/artemb'     
cd ${PATH}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top