为什么在使用管道命令时与使用&&;bash中的串联命令?

为什么在使用管道命令时与使用&&;bash中的串联命令?,bash,datetime,command-line,pipe,Bash,Datetime,Command Line,Pipe,我为current_datetime实现了一个小python函数,并将其插入到bash脚本中 $ current_datetime 2017-08-29 12:01:18.413240 后来,我把它赋给了一个变量 $ DT=$(current_datetime) 我可以打电话给你 $ echo $DT 2017-08-29 12:03:48.213455 #and get a time some seconds later for sure 但是如果我运行下一行几次,我会得到相同的

我为current_datetime实现了一个小python函数,并将其插入到bash脚本中

$ current_datetime

2017-08-29 12:01:18.413240
后来,我把它赋给了一个变量

$ DT=$(current_datetime)
我可以打电话给你

$ echo $DT

2017-08-29 12:03:48.213455   #and get a time some seconds later for sure
但是如果我运行下一行几次,我会得到相同的结果(请注意,粗体中秒的小数部分是相同的)

反过来,当我使用
&&
而不是
|
时,我得到了每次按下
Enter
按钮的确切时间。为什么?

$ DT=$(current_datetime) && echo $DT

2017-08-29 12:21:**11.564654**


$ DT=$(current_datetime) && echo $DT

2017-08-29 12:21:**13.522406**


$ DT=$(current_datetime) && echo $DT

2017-08-29 12:21:**14.744963**
&&
在同一命令行中的实现以及执行这些命令的确切时间方面有什么区别?

中的每个命令都在其自己的子shell中执行。这意味着变量赋值没有任何效果

$ FOO=bar | echo $FOO

$ echo $FOO

$
而以
&
分隔的命令是按顺序执行的,而不是在子shell中执行

$ FOO=bar && echo $FOO
bar
$
生成子shell的另一种方法是


一个是管道,另一个是逻辑and。在第一个示例中,它将
DT
设置为一个值,然后通过管道将输出设置为
echo$DT
。设置
DT
发生在子shell中,不会影响运行
echo$DT
的环境,甚至不会影响运行下一行的环境。在
&&
中,它运行第一个命令,该命令设置
DT
,并且,由于没有失败,它使用
DT
集执行第二个命令。
$ FOO=bar && echo $FOO
bar
$
$ (FOO=bar) && echo $FOO

$