代码之家  ›  专栏  ›  技术社区  ›  yukashima huksay

“echo a&!d”一步一步地做什么?

  •  0
  • yukashima huksay  · 技术社区  · 7 年前

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

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

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

    $ echo a & disown 
    [1] 16101
    a
    

    有人能一步一步地解释一下这两种情况下到底发生了什么吗?是什么 !d 到底是化名还是什么?谁,在什么条件下扩展它?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Benjamin W.    7 年前

    该行由两个命令组成:

    echo a &
    

    !d
    

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

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

    否认 从活动工单表中删除当前工单;在这种情况下,“当前作业”是指最后一次在后台启动的作业。


    使用历史替换时,shell会在实际运行命令之前打印扩展;这就是你看到这条线的原因

    echo a&disown
    

    随着你指挥范围的扩大。

    下一行,

    [1] 16089
    

    是因为进程已在后台启动: [1] 是作业编号,并且 16089 是进程ID。具有 a 只是 回声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
      

    工具书类