2017-07-24 179 views
1

我有一个顶级bash脚本,说ScriptA,和一个子目录DY中的一些其他bash脚本,它与脚本A处于同一级别。假设其他bash脚本在DY中是ScriptB和ScriptC。 ScriptA将在某个时间点提供ScriptB和ScriptC,并且我希望所有的脚本都能够在各自的目录中运行。这里有一个例子:将工作目录更改为当前脚本的目录

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 

所以script_a_1.txt和script_a_2.txt应在目录SCRIPTA是in和script_b_file.txt和script_c_file.txt应该在子目录DY中。

我试图把

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

在ScriptB和ScriptC的顶部和SCRIPTA当它来自ScriptB回来,但回到SCRIPTA时,工作目录仍处于DY而不是哪里SCRIPTA是英寸

有关如何完成此任何想法?

EDIT

奖金如果溶液还可以在子进程运行脚本时处理的情况下,即 SCRIPTA:

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

*也固定在初始SCRIPTA示例不采购ScriptC

回答

4

将目录ScriptB.sh推到目录堆栈上,然后运行该脚本,并在完成时弹出。

pushd DY 
source ./ScriptB.sh 
popd 

不错,干净。

也适用于子流程:

pushd DY 
./ScriptC.sh 
popd 
+0

除OP之外的所有清洁是而不是像你在这里展示的那样在子进程中运行。请修复(+1任一方式)。 –

+0

@MadPhysicist好点,刚刚修复。 – yinnonsanders

+0

工程就像一个魅力。这样做有什么警告吗? – bitscuit

0

那么你可以做这样的事情,有点脏,但起点:

在脚本B &Ç只是把:

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

无论如何,我会检查一个更好的方式来做到这一点