我想通过已包含的另一个脚本来更改我的脚本的工作目录。
第一个脚本:
#!/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
您能否使用源脚本设置变量并让原始变量根据变量的内容进行更改,而不是直接在源脚本中进行更改?