exec 命令并不启动新的 shell,而是用要被执行的命令替换当前的 shell 进程,并且将老进程的环境清理掉,exec 命令后的其它命令将不再执行。exec 在执行时会将当前的 shell process 关闭,然后切换到后面的命令继续执行。
在一个 shell 中执行 exec ls,列出当前目录后,这个 shell 就会自己退出。因为这个 shell 进程已被替换为仅仅执行 ls 命令的一个进程,进程执行结束后自然也就退出了。
这会影响我们的使用,为了避免这种情况,一般将 exec 命令放到一个 shell 脚本中,用主脚本调用这个脚本。调用点处可以用 bash a.sh(a.sh 包含 exec ls),这会为 a.sh 建立一个 sub shell 去执行,当执行到 exec 时,该 sub shell 将被替换成 ls 进程。
source 命令或者“.”不会为脚本新建 shell,而只是将脚本包含的命令在当前 shell 执行。
修改当前文件描述符
$ exec 3 < afile
这将使文件描述符 3 被打开,以便从文件 afile 里读取数据。这种用法非常少见。
exec 命令对文件描述符操作时不会替换 shell,并且操作完成后仍会继续执行后面的命令。
exec 命令还可以作为 find 命令的一个选项
1. 在当前目录下(包含子目录)查找所有 txt 文件,并找出含有字符串 bin 的行
$ find ./ -name “*.txt” -exec grep “bin” {} \;
2. 在当前目录下(包含子目录)删除所有 txt 文件
$ find ./ -name “*.txt” -exec rm {} \;
-exec 后是 command 命令,命令必须以;为结束标志,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。
{} 花括号代表 find 找到的文件名。