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?
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.
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é
Compte tenu de l’illisibilité et de la complication excessive des réponses, j’estime que le demandeur devrait faire
PATH
. scriptname
Le .
(point) s'assurera que le script n'est pas exécuté dans un shell enfant.
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.
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é.
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.
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
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
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 .
J'ai fait un script pour changer de répertoire. jetez un oeil: https://github.com/ygpark/dj
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:
cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin
comme première ligne.chmod 755 mongobin
source mongobin
pwd
Voila!
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
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.
Déclarez votre chemin:
PATH='/home/artemb'
cd ${PATH}
Ajoutez ci-dessous la ligne cd dans votre shellcript ceci:
exec $Shell