假设我有多个并行运行的 bash 脚本,代码如下:
#!/bin/bash
tail -f /dev/null &
echo "pid is "$!
保证$!
给我最近后台任务的PID在那个脚本中,或者是全球最新的后台任务?我只是好奇当它返回的 PID 来自另一个脚本中启动的进程时,依赖此功能是否会导致竞争条件。
答案1
$!
保证为您提供 shell 执行该命令的进程的 pid tail
。 Shell 是单线程的,每个 shell 都存在于自己的进程中,并具有自己的变量集。$!
一个贝壳是不可能的泄露到另一个 shell 中,就像在一个 shell 中分配一个 shell 变量一样,不会影响另一个 shell 中的同名变量(如果我们将通用变量壳fish
)。
现在,tail -f /dev/null
是一个无限期运行的命令,但对于短期命令,请注意,由于可能的进程 ID 数量有限,进程 ID 不可避免地最终会被重用。
在:
true &
pid=$!
它将$pid
包含 shell 运行的进程的 id true
,但是当您使用它时$pid
,该 pid 很可能已经死亡并且可能引用不同的进程。