"echo a&!d"一步一步到底是做什么的?

What does "echo a&!d" exactly do step by step?

我尝试了以下方法并得到:

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

然后我尝试了以下方法并得到:

$ echo a & disown 
[1] 16101
a

有人可以逐步解释这两种情况到底发生了什么吗? !d 到底是什么,它像一个别名还是什么?谁,在什么条件下扩展它?

该行由两个命令组成:

echo a &

!d

第一个运行s echo a&使其在后台执行,即在子shell.

中异步执行

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

disown 从 table 个活动作业中删除当前作业;在这种情况下,"current job" 指的是最后在后台启动的作业。


当您使用历史替换时,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
    

参考资料