`exec command [arguments]` 中的 `command [arguments]` 运行的执行环境是什么?

`exec command [arguments]` 中的 `command [arguments]` 运行的执行环境是什么?

来自 bash 手册

执行

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

如果提供命令,它将替换 shell,而不创建新进程。如果提供了 -l 选项,shell 会在传递给命令的第 0 个参数的开头放置一个破折号。这就是登录程序的作用。-c 选项导致命令在空环境中执行

如果没有-c选项,运行的执行环境是什么command [arguments]

  • 与原shell进程运行前的执行环境是否相同exec command [arguments]

  • 原shell进程中的执行环境不仅包含环境变量,还包含所有shell变量,包括非环境变量。commandin运行的执行环境exec command是否还包括原shell进程中的非环境变量?

你能举一些例子来证明这一点吗?

答案1

您正在混淆两种不同的事物:执行环境环境变量

环境变量是 形式的字符串name=value,用作命令和进程的配置形​​式。例如,PATH当仅提供命令的文件名时,是一个以冒号分隔的目录列表,在其中查找可执行命令;LANG以及以LC_control the locale 开头的各种变量,等等。

执行环境包括影响命令运行方式的所有 shell 功能。当然,它包括环境变量,还包括工作目录、文件创建掩码 ( umask)、shell 函数和定义的别名等。

在执行点(即 shell 开始执行命令的那一刻),执行环境在所有情况下几乎完全相同,无论是否有exec.使用exec,会触发 shellEXIT陷阱(因为当被另一个进程替换时,shell 实质上正在退出)。使用exec -c,环境变量被清除。

-cBash 的标志仅exec清除环境变量。如果你跑

bash -c `exec env`

您启动一个新的 Bash shell,然后将其替换为命令env;当没有指定其他参数时,仅输出所有环境变量。但是,如果将-c标志添加到exec,即

bash -c `exec -c env`

它什么也不打印,这是因为env它在没有环境变量的情况下运行(或者,换句话说,是一个空环境)。

(如果您只exec env在终端中运行,则在终端中运行的 shell 将被命令替换env,当它退出时,终端将关闭。它可能发生得太快,您看不到。这就是为什么我显式运行它位于 Bash 下,这样,替换的是子 Bash,而不是您的终端正在使用的 shell。)

我还没有看到-c现实生活脚本中使用的选项,因为通常env -i会使用它。例如:

bash -c `exec env -i PATH=$PATH env`

带参数,该env命令用于运行修改了环境变量的命令;该-i选项用于从头开始;即清除所有现有的环境变量。因为 shell 在执行之前会解析整个命令(行),所以您可以使用shell 解析命令行时使用旧值来定义它们来env -i VAR=$VAR OTHER=$OTHER保留特定的环境变量。env在上面,finalenv只是打印出结果环境变量,但它可以是任何其他命令。

相关内容