Bash

可以$!在並行執行的腳本中使用時會導致競爭條件嗎?

  • August 25, 2019

假設我有多個並行執行的 bash 腳本,程式碼如下:

#!/bin/bash

tail -f /dev/null &
echo "pid is "$!

$!保證給我該腳本中最新後台任務的PID ,還是全球最新後台任務?我只是好奇,當它返回的 PID 來自另一個腳本中啟動的程序時,依賴此功能是否會導致競爭條件。

$!保證為您提供 shell 執行該tail命令的程序的 pid。Shell 是單執行緒的,每個 Shell 都存在於自己的程序中,並帶有自己的一組變數。$!一個shell的 不可能洩漏到另一個shell中,就像在一個shell中分配一個shell變數不會影響另一個shell中的同名變數(如果我們把shell的通用變數fish放在一邊) .

現在,tail -f /dev/null是一個無限期執行的命令,但對於短期命令,請注意,由於可能的程序 ID 數量有限,程序 ID 不可避免地最終會被重用。

在:

true &
pid=$!

$pid將包含執行 shell 的程序的 id true,但是當您使用它$pid時,該 pid 很可能已經死了,並且可能指的是不同的程序。

引用自:https://unix.stackexchange.com/questions/537297