Linux 中的 exec 命令 [With Easy Examples]

Linux 中的 exec 命令用于通过用该命令替换当前进程来执行命令。 在贝壳中,例如 bashksh,它还用于重定向完整会话或整个脚本的文件描述符。

exec 命令基本用法

exec 命令可以被认为是对 bash -c <program> 选择。 使用后者实际上会产生一个子进程。 Bash 等待子进程完成,然后自行退出。

使用 exec, program 替换调用进程(父进程)并且不产生子进程。 如果不需要父级,此行为可能很有用。 让我们看看如何使用 exec 执行命令

1.执行命令

执行另一个程序/命令是主要用途 exec 命令。 它是通过将程序的名称作为参数提供给 exec.

exec <program-name> 

2. 打开和 close 文件描述符

exec 命令也用于打开或 close 一个文件描述符。 这在脚本中最有用。 打开和 close 文件描述符, exec 命令不应被赋予任何参数,如下所示

exec 3< thisfile 

这将打开名为的文件 thisfile 用于读取文件描述符 3。

exec 4> anotherfile 

这将打开名为的文件 anotherfile 用于写入文件描述符 4。

到 close 文件描述符,可以再次使用 exec 命令,如下所示

exec 3<&- #or # exec 4>&- 

exec 命令示例

exec 不是您每天使用的命令之一,但它肯定是您在程序的包装脚本中经常使用的命令。

1.为程序设置环境变量,然后执行它

一个程序可能需要相当多的环境变量。 从设置所有内容并最终设置的 shell 脚本运行该程序更容易且更易于维护 execs 程序。

一个例子可能看起来像

#!/bin/sh ENVIRONMENT=$(some complex task) exec command 

一个真实的例子是 Google Chrome 浏览器。 如果您遵循符号链接 chrome 可执行文件,你会发现谷歌浏览器实际上是作为一个 BASH 脚本执行的,它最终在脚本的末尾调用 exec。

您可以运行以下使用 cat 和 tail 命令的单行程序,并查看正在使用的 exec chrome 脚本。

cat /opt/google/chrome/google-chrome | tail -10 

2. 在脚本中重定向文件描述符

假设您希望脚本的所有输出都转到特定文件或来自特定文件的所有输入,您可以通过像这样在命令行上进行重定向来实现

script.sh > output.txt 2> /dev/null 

但是如果你想对用户隐藏细节,你可以在脚本中进行重定向。 让我们以一个简单的脚本来编译和运行 C++ 程序。 只关注脚本的 exec 部分。

#!/bin/bash PROJECT_DIR="."  exec 2> /dev/null               # Discard all errors exec 1> $PROJECT_DIR/output.txt	# redirect all output of this script to a output.txt file   if [ ! -e BoolienInvasion ]				 then  	bison -d $PROJECT_DIR/BoolienInvasion.y  	flex $PROJECT_DIR/BoolienInvasion.l  	g++ -w -o $PROJECT_DIR/BoolienInvasion $PROJECT_DIR/lex.yy.c $PROJECT_DIR/BoolienInvasion.tab.c fi  cat [email protected] > finalinput.input 				 $PROJECT_DIR/BoolienInvasion < finalinput.input  rm finalinput.input 

3. 更改您的登录外壳

某些站点只允许使用指定的某些登录 shell /etc/passwd. 您仍然可以通过 exec 命令使用您喜欢的 shell。 只需输入

exec <shell> # example - exec ksh 

在里面 .profile 那个旧壳。 在这个 exec 命令之后,你最喜欢的 shell 将替换旧的 shell,就像你登录到你最喜欢的 shell 一样。

结论

exec 不是您会在每个脚本中使用的命令。 但有时它会派上用场。 你可以跑 help exec 了解更多关于 exec 的选项。 您还可以访问其手册页。 我希望这篇文章能够揭开 exec 的神秘面纱。 你不知道 exec 的哪些用途? 让我们在评论中知道。