使用env和带有变量赋值的命令之间的区别是什么?

时间:2018-01-25 11:24:19

标签: bash

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

CLICOLOR=1 ls

但我也可以这样做

env CLICOLOR=1 ls

两者都会产生相同的结果,所以我想知道是否有任何区别?为什么人们使用一个而不是另一个?是因为可移植性,还是在使用输出重定向或管道等时有什么不同?

2 个答案:

答案 0 :(得分:4)

这主要是因为您不必仅仅为了设置变量而运行shell。许多工具允许您运行单个命令来执行特定任务(cron作业,构建系统,内部脚本或各种工具的宏语言),并且您希望最大限度地降低此类方案的性能影响和安全性。

答案 1 :(得分:0)

  

两者都会产生相同的结果,..

不!

  

..,所以我想知道是否有任何区别?

是的!

只是一些试验和错误给出了一些有趣的结果。我认为这会补充@ tripleee的answer

# 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

使用[ this ]回答内联阅读以下内容。

  • PATH=bingo echo $PATHPATH=bingo开头,作业
  • env PATH=bingo echo $PATHenv开头, 分配

希望这有帮助。