J'ai écrit un script bash qui crée une série de répertoires et clone un projet dans des répertoires sélectionnés.
Pour cela, j'ai besoin de cd
chaque répertoire ( project 1
et project 2
), mais le script ne fait pas cd
le deuxième répertoire ni n'exécute la commande.
Au lieu de cela, il s'arrête après cd
et clonage dans le project2
répertoire. Pourquoi n'appelle-t-il pas la cd_project1
fonction dans le code suivant?
#!/bin/bash
#Get the current user name
function my_user_name() {
current_user=$USER
echo " Current user is $current_user"
}
#Creating useful directories
function create_useful_directories() {
if [[ ! -d "$scratch" ]]; then
echo "creating relevant directory"
mkdir -p /home/"$current_user"/Downloads/scratch/"$current_user"/project1/project2
else
echo "scratch directory already exists"
:
fi
}
#Going to project2 and cloning
function cd_project2() {
cd /home/"$current_user"/Downloads/scratch/"$current_user"/project1/project2 &&
git clone https://username@bitbucket.org/teamsinspace/documentation-tests.git
exec bash
}
#Going to project1 directory and cloning
function cd_project1() {
cd /home/"$current_user"/Downloads/scratch/"$current_user"/project1/ &&
git clone https://username@bitbucket.org/teamsinspace/documentation-tests.git
exec bash
}
#Running the functions
function main() {
my_user_name
create_useful_directories
cd_project2
cd_project1
}
main
Sortie borne:
~/Downloads$. ./bash_install_script.sh
Current user is mihi
creating relevant directory
Cloning into 'documentation-tests'...
remote: Counting objects: 125, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 125 (delta 59), reused 0 (delta 0)
Receiving objects: 100% (125/125), 33.61 KiB | 362.00 KiB/s, done.
Resolving deltas: 100% (59/59), done.
~/Downloads/scratch/mihi/project1/project2$
bash
scripts
cd-command
Jenny
la source
la source
exec bash
faire.Réponses:
Les coupables sont vos
exec bash
déclarations dans certaines de vos fonctions. Laexec
déclaration est un peu bizarre et difficile à comprendre en premier lieu. Cela signifie: exécutez la commande suivante au lieu de la commande / shell / script en cours d'exécution à partir d'ici . C'est-à-dire: il remplace le script shell actuel (dans votre cas) par une instance debash
et il ne revient jamais.Vous pouvez essayer cela avec un shell et un problème
Cela remplacera votre shell actuel (le
bash
) par la commandesleep 5
et lorsque cette commande reviendra (après 5 secondes) votre fenêtre se fermera car le shell a été remplacé parsleep 5
.Même chose avec votre script: si vous mettez
exec something
dans votre script, le script est remplacé parsomething
et quand celasomething
arrête l'exécution, le script entier s'arrête.La simple suppression des
exec bash
déclarations devrait suffire.la source
exec
instruction avec le même comportement et si vous mettez des instructions après uneexec
instruction (commeexec something; print "This won't run";
) alors Perl vous avertira que l'print
instruction ne sera jamais exécutée.set -e
). J'ai vu Code comme uncd tmp; rm -rf *
horrible échecDe
help exec
:Le mot clé ici est remplacer - si vous
exec bash
de l'intérieur d'un script, aucune autre exécution de script ne peut se produire.la source
si vous voulez un retour au répertoire que vous avez commencé, vous pouvez utiliser
Mais si vous n'êtes pas sûr si une
cd
commande a été exécutée, il serait préférable d'utiliser les commandes pour placer les répertoires de travail sur une pile:et y revenir (même après plusieurs changements de répertoire)
assurez-vous d'avoir equaly
pushd
etpopd
commandes.la source