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

Tim*_*Tim 2 bash exec

来自 bash 手册

执行

exec [-cl] [-a name] [command [arguments]]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 和运行前原shell进程中的执行环境一样exec command [arguments]吗?

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

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

Nom*_*mal 5

您将两种不同的东西混为一谈:执行环境环境变量

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

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

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

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

bash -c `exec env`
Run Code Online (Sandbox Code Playgroud)

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

bash -c `exec -c env`
Run Code Online (Sandbox Code Playgroud)

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

(如果你只是exec env在终端中运行,终端中运行的 shell 将被env命令替换,当它退出时,终端将关闭。它可能发生得太快了,你看不到。这就是我明确运行的原因它在 Bash 下,这样,被替换的是子 Bash,而不是您的终端正在使用的 shell。)

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

bash -c `exec env -i PATH=$PATH env`
Run Code Online (Sandbox Code Playgroud)

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