我尝试了以下内容,然后得到了:
$ echo a&!d
echo a&disown
[1] 16089
a
然后我尝试了以下内容,我得到了:
$ echo a & disown
[1] 16101
a
有人可以一步一步解释这两种情况究竟发生了什么?什么是!d
究竟是它的别名还是什么?谁,在什么条件下扩展它?
答案 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
。
汇总:
echo a&!d
echo a&disown # History expansion
[1] 16089 # Job number and process ID
a # Output from echo command
echo a & disown
[1] 16101 # Job number and process ID
a # Output from echo command
<强>参考强>