我想创建一个 bash 脚本或类似的脚本,可以在当前 shell 中执行:
echo '#!/bin/bash
export foo="bar" ' > zoom.sh
但如果我想在当前进程中运行这个脚本:
exec ./zoom.sh
那么我的终端将退出“进程完成”,即使我使用set +e
,它仍然退出。
和source
whicheval
将在当前 shell 中运行内容,所以也许 eval 是我最好的选择? bash 函数可以工作 - 但我source
首先必须依赖用户来使用它。
答案1
从手册来看,exec 不会创建新进程,它只是替换当前的 shell,因此执行后它也会终止会话。
exec [-cl] [-a name] [command [arguments]]
:
如果指定了命令,它将替换 shell。没有创建新进程。这些参数成为命令的参数。如果提供了 -l 选项,shell 会在传递给命令的第 0 个参数的开头放置一个破折号。这就是登录(1)的作用。该-c
选项导致命令在空环境中执行。如果-a
提供,shell 将 name 作为第 0 个参数传递给执行的命令。如果由于某种原因无法执行命令,则非交互式 shell 将退出,除非execfail
启用了 shell 选项,在这种情况下它将返回失败。如果文件无法执行,交互式 shell 将返回失败。如果不指定command,则任何重定向都在当前shell中生效,返回状态为0。如果存在重定向错误,则返回状态为1。
$ cat zoom.sh
#!/bin/bash
export foo="bar"
echo $?
$ exec ./zoom.sh
0
Connection to localhost closed