将工作目录更改为当前脚本的目录

时间:2017-07-24 21:27:25

标签: bash

我有一个顶级bash脚本,比如ScriptA,以及子目录中的几个其他bash脚本,DY与Script A处于同一级别。让我们说DY中的其他bash脚本是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所在的目录中,而script_b_file.txt和script_c_file.txt应该在子目录DY中。

我尝试过放置

cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd
当ScriptB和ScriptC从ScriptB返回时,它位于ScriptB和ScriptA的顶部,但是当返回ScriptA时,工作目录仍然在DY中而不是ScriptA所在的位置。

关于如何实现这一目标的任何想法?

修改

如果解决方案在子进程中运行脚本时也可以处理这种情况,那就是奖励,即 SCRIPTA:

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

*还修复了最初的ScriptA示例,而不是采购ScriptC

2 个答案:

答案 0 :(得分:4)

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

pushd DY
source ./ScriptB.sh
popd

很干净。

也适用于子流程:

pushd DY
./ScriptC.sh
popd

答案 1 :(得分:0)

嗯,你可以做这样的事,有点肮脏但是一个起点:

在剧本B& C刚刚提出:

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

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