在子Shell中运行命令

4
我希望自动化一个我经常进行的重复任务。这个任务包括为不同架构创建rpm's。为了编译代码并创建rpm,我需要设置项目环境。在设置环境后,我将为当前架构创建rpm,然后再次通过重新设置环境来构建其他架构的rpm。
我正在尝试自动化这个过程。问题是一旦环境被设置它将成为新的shell,所以我的脚本在子shell中不可见。如何自动化这个过程?以下是我尝试过的方法:
cd $project_dir
setenv.sh x86      #creates new sub shell
make clean
make rpm
cp *rpm ~/

exit              #exit from the sub shell

setenv.sh x86_64     #creates new shell
make clean
make rpm
cp *.rpm ~/

exit

在将环境设置为x86后,接下来的命令没有被执行。


2
setenv.sh 究竟是做什么的?你脚本的下一行 make clean 不会运行,直到 setenv.sh 返回,并且它不会在任何子 shell 中运行;它将在调用 setenv.sh 的同一个 shell 中运行。 - chepner
setenv.sh 会在新的 shell 中设置编译环境。 - Dinesh Reddy
2
这是什么意思?你只是在设置一些环境变量吗?如果是这样,那么这些更改只会持续到 setenv.sh 退出之前,而这是在 make clean 运行之前的。 - chepner
1个回答

6
您可以这样强制执行2个部分在子shell中执行:
cd "$project_dir"

(. setenv.sh x86
make clean
make rpm
cp *rpm ~/)

(. setenv.sh x86_64
make clean
make rpm
cp *.rpm ~/)

我尝试过了。()会创建子shell,但在该子shell中,setenv.sh将创建另一个shell。因此,这些make命令在那个shell中是不可见的。 - Dinesh Reddy
好的,我试过了。但是现在我无法设置环境变量。我收到了错误信息 setenv.sh: line 464: svnenvopts.source: No such file or directory。那个点号(.)是什么意思?我想我在执行这个操作后丢失了路径。 - Dinesh Reddy
1
我无法访问 setenv.sh,因此我无法猜测为什么会出现那个错误。 - anubhava
@DineshReddy setenv.sh 在这里不会创建子shell。它不是被执行,而是通过 . 进行 _sourced_。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接