有人可以帮我理解两者之间的区别吗
bash -c 'echo $SHELL $HOME $USER'
和
env -i bash -c 'echo $SHELL $HOME $USER'
我尝试了很多次,但还是不明白。我正在研究env
并bash -c
出现在示例中。具体是bash -c
做什么的?
答案1
env -i
在空环境下执行指定的命令。
bash -c …
将选项的参数-c
(the …
) 作为 bash 代码片段执行。
bash -c 'echo $SHELL $HOME $USER'
相当于echo $SHELL $HOME $USER
,因为运行 bash 不会修改这些变量(至少只要它们最初设置)。
env -i bash -c 'echo $SHELL $HOME $USER'
bash
使用参数-c
和echo $SHELL $HOME $USER
以及空环境运行。当 bash 启动时,它会设置一些 shell 变量,包括SHELL
(仅设置为 shell 变量,不会导出到 bash 可能启动的任何子程序的环境中)。因此,当 bash 解析和扩展命令时echo $SHELL $HOME $USER
,变量HOME
和USER
未被设置,但SHELL
被设置为/bin/sh
(我不知道为什么 bash 这样做),并且该命令显示/bin/sh
后跟两个空格。
参数周围的单引号bash -c
确保引号内的文本不会被运行的 shell 扩展env -i bash -c '…'
,以便文本按原样传递到 bash 子进程。