2017-07-24 1 views
1

J'ai un script bash de haut niveau, disons ScriptA, et quelques autres scripts bash dans un sous répertoire, DY qui est au même niveau que le Script A. Disons les autres scripts bash dans DY sont ScriptB et ScriptC. ScriptA récupérera à la fois ScriptB et ScriptC, et je veux que tous les scripts soient exécutés dans leurs répertoires respectifs. Voici un exemple:Changer le répertoire de travail au répertoire du script courant

Scripta:

#!/bin/bash 
touch script_a_1.txt 
source DY/ScriptB.sh 
touch script_a_2.txt 
source DY/ScriptC.sh 

ScriptB:

#!/bin/bash 
touch script_b_file.txt 

ScriptC:

#!/bin/bash 
touch script_c_file.txt 

Alors script_a_1.txt et script_a_2.txt devrait être dans le répertoire Scripta in, et script_b_file.txt et script_c_file.txt doivent être dans le sous-répertoire DY.

J'ai essayé de placer

cd "$(dirname "${BASH_SOURCE[0]}")" && pwd 

en haut de ScriptB et ScriptC et Scripta quand il revient de ScriptB, mais lors du retour à Scripta, le répertoire de travail est toujours en DY au lieu de là où Scripta

Des idées sur la façon d'accomplir cela?

EDIT

Bonus si la solution peut également gérer le cas lors de l'exécution du script dans un sous-processus, à savoir Scripta:

#!/bin/bash 
touch script_a_1.txt 
source DY/ScriptB.sh 
touch script_a_2.txt 
DY/./ScriptC.sh 

* également fixé l'exemple initial Scripta pas l'approvisionnement ScriptC

Répondre

4

Poussez le répertoire ScriptB.sh sur la pile de répertoires, puis exécutez le script et faites-le lorsque vous avez terminé.

pushd DY 
source ./ScriptB.sh 
popd 

Nice et propre.

fonctionne aussi pour les sous-processus:

pushd DY 
./ScriptC.sh 
popd 
+0

Tout nettoyer sauf que OP est sourcing au lieu de courir dans un sous-processus comme vous le montrez ici. Veuillez corriger (+1 de toute façon). –

+0

@MadPhysicist Bon point, juste corrigé. – yinnonsanders

+0

Fonctionne comme un charme. Y a-t-il des réserves à faire cela? – bitscuit

0

Eh bien vous pouvez faire quelque chose comme ça, un peu de sale, mais un point de départ:

Dans le script B & C vient de mettre:

cd subdirectory && touch ./your_file_name.log && cd .. 

En tout cas je vais vérifier une meilleure façon de le faire