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