来自 bash 手册
执行
Run Code Online (Sandbox Code Playgroud)exec [-cl] [-a name] [command [arguments]]
如果提供了命令,它将替换外壳而不创建新进程。如果提供了 -l 选项,shell 会在传递给 command 的第零个参数的开头放置一个破折号。这就是登录程序所做的。-c 选项导致命令在空环境下执行。
没有-c
选项,command [arguments]
运行的执行环境是什么?
和运行前原shell进程中的执行环境一样exec command [arguments]
吗?
原始shell进程中的执行环境不仅包含环境变量,还包含包括非环境变量在内的所有shell变量。command
inexec command
运行所在的执行环境是否也包含原始shell进程中的非环境变量?
你能举一些例子来说明这一点吗?
环境变量是形式的字符串,name=value
用作命令和进程的一种配置形式。例如,PATH
当只提供命令的文件名时,是一个以冒号分隔的目录列表,其中查找可执行命令;LANG
以及以LC_
控制语言环境等开头的各种变量。
执行环境包括影响命令运行方式的所有 shell 功能。当然,它包括环境变量,还包括工作目录、文件创建掩码 ( umask
)、shell 函数和定义的别名等。
在执行点——shell 开始执行命令的那一刻——在所有情况下,执行环境几乎完全相同,无论有没有exec
. 使用exec
,shellEXIT
陷阱被触发(因为 shell 本质上是退出,当被另一个进程替换时)。使用exec -c
,清除环境变量。
-c
Bash的标志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
只是打印出结果环境变量,但它可以是任何其他命令。