Bash
可以$!在並行執行的腳本中使用時會導致競爭條件嗎?
假設我有多個並行執行的 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 的程序的 idtrue
,但是當您使用它$pid
時,該 pid 很可能已經死了,並且可能指的是不同的程序。