从“源”脚本更改父脚本的工作目录

从“源”脚本更改父脚本的工作目录

我想通过已包含的另一个脚本来更改我的脚本的工作目录。

第一个脚本:

#!/bin/bash
pwd
source script2
pwd

第二个脚本:

cd ..
pwd

结果如下:

> ./script1
/home/sebi/testdir1/testdir2  # 1st script
/home/sebi/testdir1           # 2nd script
/home/sebi/testdir1           # 1st script

我已经编辑了问题当我测试这个脚本时,它按我想要的方式工作,但是下面的脚本的工作方式有所不同,因为下标完成执行后,父级位于与调用下标之前相同的目录中。

#!/bin/bash
while :
do
sleep 5  

cat /home/.../shelldata.txt >> /home/.../gmodshell #logging

((source /home/..../shelldata.txt) 2>&1) | \
sed -e "s/..shellRunner.sh..line../SH/" > \
/home/..../shellFeedback.txt

echo > /home/..../shelldata.txt

done

整个目的是使用文件访问 bash,这样我就可以将命令写入一个文件,过一会儿我就会在另一个文件中得到输出。

答案1

假设脚本 1 和 2 位于同一目录中,尝试制作脚本 1:

#!/bin/bash
pwd
. ./script2
pwd

将点放在对脚本的调用之前(我指的是第一个点,而不是要调用的脚本文件路径的一部分)告诉 shell “在进程,而不是为其产生一个新进程。”

第二个脚本中采取的操作(如 cd-ing 或设置变量)将在第二个脚本结束后持续存在。

答案2

来自bash文档:

命令替换、用括号分组的命令和异步命令在子 shell 环境中调用,该子 shell 环境与 shell 环境相同,不同之处在于 shell 捕获的陷阱在调用时被重置为 shell 从其父级继承的值。作为管道的一部分调用的内置命令也在子 shell 环境中执行。对子 shell 环境所做的更改不会影响 shell 的执行环境。

因此,在使用(点)命令获取文件时,应避免使用括号.(如这个答案)。

答案3

这并不特定于获取脚本。使用单个脚本即可获得完全相同的结果。尝试:

#!/bin/bash
pwd
cd ..
pwd

原因是启动的脚本是在子 shell 中执行的。当脚本返回时,子 shell 将被关闭,然后您将返回到原始 shell,无论您在脚本中的哪个位置。

如果您想要命令将您带到另一个目录,您应该使用别名或 bash 函数:

function script1 () { cd ..; }

答案4

您能否使用源脚本设置变量并让原始变量根据变量的内容进行更改,而不是直接在源脚本中进行更改?

相关内容