如何执行bash脚本而无需退出shell

时间:2019-05-31 03:15:54

标签: bash shell exec

我想在当前shell中执行bash脚本,而不是在subshel​​l / subprocess中执行。我相信使用exec可以做到这一点。 但是如果我运行:

exec ./my_script.sh

该外壳将退出,并显示“进程已完成”。有没有一种方法可以在同一外壳中执行脚本,而无需退出进程。

请注意my_script.sh唯一要做的是:

export foo=bar

但是如果我的脚本中有一些错误,则它不会出现在控制台中。

3 个答案:

答案 0 :(得分:2)

正如@Snakienn所说,您可以/应该使用“。”内置命令可“获取”包含命令的文件;例如

 . ./my_script.sh

此操作是临时更改shell从中读取命令的位置。从文件中读取命令和其他外壳程序输入,就像从终端中读取它们一样。当shell到达文件末尾时,它将切换回从控制台获取输入。

这称为“采购”。 (不是“执行”。)实际上,shell接受source作为.命令的替代名称。

exec命令的作用完全不同。正如bash手动输入所述:

 exec [-cl] [-a name] [command [arguments]]
     

如果指定了命令,它将替换外壳程序。没有创建新的过程。参数成为命令的参数。

exec的概念和术语来自早期的UNIX(即Unix V6或更早的UNIX),其中运行子命令的系统调用为forkexec。程序是:

  • fork当前进程创建当前进程(子进程)的克隆
  • 在子进程exec中使用新命令
  • 在父进程中,等待子进程完成

答案 1 :(得分:0)

您可以尝试. ./my_script.sh

第一个点代表当前外壳。

答案 2 :(得分:0)

手册页说:-

  

exec [-cl] [-a名称] [命令[参数]]         如果指定了command,它将替换shell。没有新流程         被建造。自变量成为命令的自变量。如果         提供了-l选项,shell将破折号放在         传递给command的第零个参数的开头。这是         login(1)的作用。 -c选项导致命令被执行         一个空的环境。

如果要在当前shell中执行bash脚本,可以尝试

  

bash my_script.sh或./my_script.sh