什么"回声&!d"确切地一步一步做?

时间:2018-01-07 22:04:47

标签: bash echo alias

我尝试了以下内容,然后得到了:

$ echo a&!d
echo a&disown 
[1] 16089
a

然后我尝试了以下内容,我得到了:

$ echo a & disown 
[1] 16101
a

有人可以一步一步解释这两种情况究竟发生了什么?什么是!d究竟是它的别名还是什么?谁,在什么条件下扩展它?

1 个答案:

答案 0 :(得分:3)

该行包含两个命令:

echo a &

!d

第一个运行echo a&使其在后台运行,即在子shell中异步运行。

第二个是历史替换,它运行以d开头的最后一个命令。在你的情况下,这似乎是disown,但它可以是任何东西。

disown从活动作业表中删除当前作业;在这种情况下,"当前的工作"是指最后在后台开始的工作。

当您使用历史记录替换时,shell会在实际运行命令之前打印扩展;这就是为什么你看到这条线

echo a&disown

扩展你的命令。

下一行,

[1] 16089

是因为进程已在后台启动:[1]是作业编号,16089是进程ID。 a行只是echo a命令的输出。

当你第二次运行命令时,没有历史记录扩展,你得到

[1] 16101

直接,因为没有历史扩展显示;作业编号再次为1,进程ID已更改为16101

汇总:

  1. echo a&!d

    echo a&disown   # History expansion
    [1] 16089       # Job number and process ID
    a               # Output from echo command
    
  2. echo a & disown

    [1] 16101       # Job number and process ID
    a               # Output from echo command
    
  3. <强>参考