Bash 什么';使用env和在命令前面添加变量赋值之间的区别是什么?

Bash 什么';使用env和在命令前面添加变量赋值之间的区别是什么?,bash,Bash,当我想更改在bash中执行的命令的环境时,我可以在它前面加一个变量赋值。例如,如果我暂时想设置CLICOLOR变量,我可以这样做: CLICOLOR=1 ls 但我也可以这样做 env CLICOLOR=1 ls 两者的结果相同,所以我想知道是否有什么不同?为什么人们用一个代替另一个?这是因为可移植性,还是在使用输出重定向或管道等时存在任何差异 两者的结果相同 不 ,所以我想知道是否有什么不同 对! 只是一些尝试和错误给出了一些有趣的结果。我想这将是对@tripleee的补充 阅读以下与答案

当我想更改在bash中执行的命令的环境时,我可以在它前面加一个变量赋值。例如,如果我暂时想设置
CLICOLOR
变量,我可以这样做:

CLICOLOR=1 ls
但我也可以这样做

env CLICOLOR=1 ls
两者的结果相同,所以我想知道是否有什么不同?为什么人们用一个代替另一个?这是因为可移植性,还是在使用输出重定向或管道等时存在任何差异

两者的结果相同

,所以我想知道是否有什么不同

对!

只是一些尝试和错误给出了一些有趣的结果。我想这将是对@tripleee的补充

阅读以下与答案一致的要点

  • PATH=bingo echo$PATH
    PATH=bingo
    开头,这是一个赋值
  • env PATH=bingo echo$PATH
    env
    开头,它不是赋值

希望这能有所帮助。

这主要是为了不必运行shell来设置变量。许多工具允许您运行单个命令来执行特定任务(cron作业、构建系统、各种工具的内部脚本或宏语言)您希望将这种情况下的性能影响和安全表面降至最低。

env
在修改后的环境中运行程序
env-i
可能会遇到问题。
echo
的问题是它是一个shell内置项,而不是二进制项,
env
尝试调用二进制项。with
PATH=bingoecho$PATH
(即使在
echo
的参数周围有适当的双引号),调用shell在计算任何内容之前会展开
$PATH
,因此这有点像苹果对桔子。有一个二进制文件
/bin/echo
,如果不弄乱它的
路径
,它就是
env
最终执行的文件。当然,
env PATH=/bin echo“$PATH”
也会在计算任何内容之前打印
路径。@hek2mgl:我忘了
echo
是内置的。但是,尽管是偶然的,它是否在这两种方法之间带来了另一个区别?@tripleee
这是苹果对橙子的一点区别。的确正如切特·拉米(Chet Ramey)所说,伯恩贝壳中有黑暗的角落,人们都在使用它们。然而,关键不是做出假设。
# Where it differs
# PATH=bingo echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
# Here the variable expansion happened before setting the PATH
# env PATH=bingo echo $PATH
env: ‘echo’: No such file or directory
# When an `env` is appended in the beginning, the PATH has changed (even)
# before the the full path of echo is resolved, hence the error