Skip to content Skip to footer

shell exec命令(exec指令)(实现进程替换)

在脚本中看到exec命令,不知道干什么用的。。。

解释:

exec 是一个 Shell 内置命令,它的作用是将当前进程替换为指定的命令或程序。具体来说,exec 命令会将指定的命令或程序加载到当前进程的内存空间中,并将当前进程的 PID(进程 ID)保持不变,同时替换当前进程的代码、数据和堆栈等信息,从而实现进程的替换。

exec 命令的作用有以下几个方面:

节省系统资源:使用 exec 命令可以避免创建新的进程,从而节省系统资源。

优化进程性能:使用 exec 命令可以减少进程间的通信和数据拷贝,从而提高进程的性能。

实现进程的替换:使用 exec 命令可以实现进程的替换,从而在不创建新进程的情况下更新进程的代码和数据。

比如,如果在容器的entrypoint.sh脚本中执行 exec “start” 命令,可能会启动容器内部的某个应用程序或服务。

文章目录

20230816Shell Exec命令:进程替换的实现目录1. 什么是Exec命令?2. Exec命令如何工作?3. Exec命令的用途3.1 改变Shell3.2 在同一进程中运行多个命令3.3 重定向输入输出

4. Exec命令示例4.1 替换当前Shell4.2 运行多个命令4.3 重定向输入输出`exec 3<&0 < file.txt`案例分析

5. Exec命令常见问题5.1 如何取消exec命令的效果?5.2 exec命令会影响到其他的shell进程吗?参考资料:

20230816

Shell Exec命令:进程替换的实现

Shell exec 命令是一个强大的工具,它在UNIX和Linux环境中用于替换当前shell进程。本文将深入探讨这个命令,其功能、使用情况以及可能遇到的问题。

目录

什么是Exec命令?Exec命令如何工作?Exec命令的用途Exec命令示例Exec命令常见问题

1. 什么是Exec命令?

exec 是一个内建的Unix/Linux shell命令,主要用于替换当前的shell或者脚本进程,并执行指定的命令1。在exec命令执行后,新的进程将会完全代替原来的进程。也就是说,新的进程并不是原来进程的子进程,而是原来进程的替代者。

2. Exec命令如何工作?

exec命令通过调用内核API execve() 来工作。当execve()被调用时,它会用新的程序替换当前进程的映像,并从新程序的主函数(通常是main())开始执行2。此时,原进程的所有代码和数据都会被新的程序替换。新的程序会继承原进程的进程ID、父进程ID和所有打开的文件描述符。

exec /path/to/new_program

3. Exec命令的用途

3.1 改变Shell

使用exec命令可以改变当前的shell。例如,如果你正在使用bash shell,但想切换到ksh shell,可以使用以下命令:

exec ksh

3.2 在同一进程中运行多个命令

exec命令还可以用于在同一进程中运行多个命令,这是通过在exec命令之后添加多个命令并使用分号隔开实现的:

exec command1 ; command2 ; command3

3.3 重定向输入输出

exec命令也可以用于重定向输入和输出。例如,你可以使用exec命令将所有的标准输出重定向到一个文件:

exec > outputfile

或者,你也可以将所有的标准输入从一个文件中获取:

exec < inputfile

4. Exec命令示例

以下是一些使用exec命令的示例:

4.1 替换当前Shell

exec bash

4.2 运行多个命令

exec echo "Starting"; echo "Running"

4.3 重定向输入输出

exec 3<&0 < file.txt

read line

echo $line

exec <&3-

在上述代码中,我们首先创建了一个新的文件描述符3,并将其与标准输入(文件描述符0)关联。然后我们改变了标准输入,使其从文件file.txt读取数据。接下来我们读取了一行数据,并将其输出。最后我们恢复了标准输入。

exec 3<&0 < file.txt案例分析

上述案例基于以下场景:

首先,当我们打开一个shell时,标准输入通常是键盘,标准输出是屏幕。也就是说,我们从键盘输入命令,然后结果在屏幕上显示。

假设我们有一个文件(如file.txt),我们想从中读取内容。如果我们使用read line < file.txt,那么在执行这条命令的过程中,标准输入被临时地从键盘重定向到了file.txt。命令执行完毕后,标准输入又会恢复为键盘。

但是,如果我们在一个脚本中同时处理文件和用户输入,情况就会变得复杂。例如,我们可能想要循环读取一个文件的每一行,并且对于每一行,我们都想询问用户是否要处理这一行。这就需要我们在读取文件的同时,还能够从键盘获取输入。

这就是为什么我们需要额外的文件描述符3。我们使用exec 3<&0 < file.txt将当前的标准输入(键盘)保存到文件描述符3,然后将标准输入重定向到file.txt。这样,在我们读取文件的同时,我们仍然可以通过文件描述符3获取用户的输入。当我们完成文件读取后,我们用exec <&3-将标准输入恢复为原来的键盘。

所以,虽然这个脚本在只读取文件内容的情况下显得过于复杂,但是在需要同时处理文件和用户输入的情况下,它是非常有用的。

关于exec 3<&0 < file.txt exec 3<&0 < file.txt这个命令做了两件事情:

3<&0:这是在创建一个新的文件描述符3,并将其指向当前进程中的标准输入(即文件描述符0)。这样,你可以通过文件描述符3来访问原始的标准输入。文件描述符通常是非负整数,用于在程序内部引用打开的文件。

< file.txt:这将标准输入重定向到"file.txt"文件。这意味着,对标准输入的任何后续读取(例如,使用read命令)都将从"file.txt"文件中获取数据,而不是原始的标准输入(通常是键盘)。

所以,exec 3<&0 < file.txt的整体作用是:它首先保存了原始的标准输入到新的文件描述符3,然后将标准输入重定向到"file.txt"文件。这样,在读取文件的同时,我们仍然可以通过文件描述符3访问原始的标准输入。

5. Exec命令常见问题

5.1 如何取消exec命令的效果?

一旦exec命令被执行,就不能取消其效果。因为exec命令会替换当前的shell进程,原进程不存在了,自然也就不能恢复。如果你想恢复到原来的状态,你需要重新启动一个新的shell进程。

5.2 exec命令会影响到其他的shell进程吗?

exec命令只会影响到执行它的shell进程,不会影响到其他的shell进程。因为每一个shell进程都有自己的进程空间,互相之间是隔离的。

以上就是关于exec命令的详细介绍。希望能帮助你更好地理解和使用exec命令。

参考资料:

Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting, by Mendel CooperThe Linux Programming Interface: A Linux and UNIX System Programming Handbook, by Michael Kerrisk

ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ

ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ

J. Cooper, “Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting”, 2002. ↩︎

M. Kerrisk, “The Linux Programming Interface: A Linux and UNIX System Programming Handbook”, No Starch Press, 2010. ↩︎