exec not bash 进程与另一个 bash

exec not bash process with another bash

我正在尝试创建新会话而无需注销和登录,所以认为 exec 会有所帮助。但是得到了关注

[root@vanhalen ~]# echo $$
46144
[root@vanhalen ~]# exec bash
[root@vanhalen ~]# echo $$
46144

我期待第二个输出的 $$ 值不同,因为新的 bash 进程应该替换旧的。这里的行为是什么?

$$是shell是运行ning的进程的进程ID。只有在创建新进程时它才会改变。

来自 bash 联机帮助页,关于 exec:

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

If command is specified, it replaces the shell. No new process is created. (...)

这意味着 exec 的行为非常类似于 C 函数 execve 及其各种前端(实际上 shell 很可能使用其中之一),因为该过程调用进程的图像被替换为描述指定命令的图像,并且 exec 从不 returns。所有这一切都是在没有产生新进程的情况下发生的;旧的 shell 就结束了。

旧流程中的新 shell、运行ning 将 运行 通过所有通常的启动动作,但是(您的 .bashrc 是来源和所有这些).这是否足以用于新会话取决于您对术语“会话”的理解。