代码之家  ›  专栏  ›  技术社区  ›  Harry

使用“$!”获取后台作业的pid

  •  0
  • Harry  · 技术社区  · 5 月前

    我编写了一个shell脚本来启动多个后台作业,并使用以下命令将它们的进程id存储在数组中 $! 。最后,我通过迭代数组来打印所有进程id。我想知道编写的shell脚本是否有bug?而且,我觉得我的shell脚本中有一个bug的原因是 $! 如果在我的PC中创建了多个进程,则可能会返回另一个进程的进程id。

    #!/bin/bash
    
    ps -a & pids+=($!) #Does $! return process id of command ps -a for sure
    ls -la & pids+=($!) #Does $! return process id of command ls -la for sure
    echo ${pids[0]}
    echo ${pids[1]}
    
    1 回复  |  直到 5 月前
        1
  •  1
  •   robertklep    5 月前

    $! “展开为最近执行的后台(异步)命令的进程ID” (来源:bash手册)

    该变量是当前shell实例的本地变量,因此在当前shell脚本/会话之外发生的任何事情都是不相关的。

    如果在后台放置两个进程:

    ps -a &
    ls -la &
    

    那么 $! 将包含最后一个背景进程的PID(在这种情况下, ls -la ).