我想在当前shell中执行bash脚本,而不是在subshell / subprocess中执行。我相信使用exec
可以做到这一点。
但是如果我运行:
exec ./my_script.sh
该外壳将退出,并显示“进程已完成”。有没有一种方法可以在同一外壳中执行脚本,而无需退出进程。
请注意my_script.sh唯一要做的是:
export foo=bar
但是如果我的脚本中有一些错误,则它不会出现在控制台中。
答案 0 :(得分:2)
正如@Snakienn所说,您可以/应该使用“。”内置命令可“获取”包含命令的文件;例如
. ./my_script.sh
此操作是临时更改shell从中读取命令的位置。从文件中读取命令和其他外壳程序输入,就像从终端中读取它们一样。当shell到达文件末尾时,它将切换回从控制台获取输入。
这称为“采购”。 (不是“执行”。)实际上,shell接受source
作为.
命令的替代名称。
exec
命令的作用完全不同。正如bash
手动输入所述:
exec [-cl] [-a name] [command [arguments]]
如果指定了命令,它将替换外壳程序。没有创建新的过程。参数成为命令的参数。
exec
的概念和术语来自早期的UNIX(即Unix V6或更早的UNIX),其中运行子命令的系统调用为fork
和exec
。程序是:
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