"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
。
总结:
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
参考资料
我尝试了以下方法并得到:
$ 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
。
总结:
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
参考资料