Bash wait 命令及示例


介紹

Bash shell 是 Unix/Linux 環境中最廣泛使用的 shell 之一。其最有用的命令之一是 wait 命令。在本文中,我們將探討 Bash wait 命令及其用法,並提供示例。

什麼是 Bash wait 命令?

wait 命令是 Bash shell 的內建命令,用於等待後臺程序終止。這意味著 Bash shell 將暫停執行,直到指定的程序完成。

Bash wait 命令的用法

wait 命令的基本語法如下:

wait [n]

這裡,'n' 是我們要等待的後臺程序的程序 ID。如果沒有指定程序 ID,則 wait 命令將等待所有後臺程序完成。

等待單個程序

假設我們有一個指令碼,它在後臺執行一個長時間執行的命令:

#!/bin/bash
sleep 10 &
echo "Command running in background..."

在這個指令碼中,我們使用“&”符號在後臺執行“sleep”命令。然後,我們向控制檯列印一條訊息。如果我們希望在繼續執行指令碼之前等待“sleep”命令完成,我們可以使用 wait 命令:

#!/bin/bash
sleep 10 &
echo "Command running in background..."
wait
echo "Command has completed!"

在這個更新後的指令碼中,我們在後臺啟動“sleep”命令後添加了“wait”命令。這意味著指令碼將等待“sleep”命令完成,然後再向控制檯列印最終訊息。

等待多個程序

有時,我們可能有多個在後臺執行的程序需要等待。在這種情況下,我們可以指定要等待的每個程序的程序 ID:

#!/bin/bash
sleep 5 &
sleep 10 &
sleep 15 &
echo "Commands running in background..."
wait %1 %2 %3
echo "All commands have completed!"

在這個指令碼中,我們在後臺執行三個“sleep”命令,每個命令的持續時間不同。然後,我們向控制檯列印一條訊息。要等待所有三個命令完成,我們可以使用“%”符號將它們的程序 ID 作為引數指定給 wait 命令。

處理錯誤

如果我們嘗試等待一個不存在的程序,wait 命令將返回一個錯誤。我們可以使用“||”運算子來處理此錯誤:

#!/bin/bash
sleep 10 &
echo "Command running in background..."
wait || echo "Process not found!"
echo "Command has completed!"

在這個指令碼中,我們在後臺執行“sleep”命令,並使用 wait 命令等待它完成。如果“sleep”命令不存在,則 wait 命令將返回一個錯誤。我們可以使用“||”運算子來處理此錯誤,該運算子只有在左側命令返回非零退出程式碼時才會執行右側命令。

將 wait 與管道一起使用

wait 命令也可以與管道一起使用。例如,如果我們有兩個命令的管道,我們可以等待第二個命令完成,然後再繼續執行指令碼:

#!/bin/bash
echo "Starting pipeline..."
echo "hello world" | grep "world" &
wait %1
echo "Pipeline has completed!"

在這個指令碼中,我們有一個由兩個命令組成的管道:“echo "hello world"”和“grep "world"”。我們使用“&”符號在後臺執行管道,然後使用 wait 命令等待第二個命令(“grep”命令)完成。

在迴圈中使用 wait

我們也可以在迴圈中使用 wait 命令來等待多個後臺程序完成。例如,假設我們有一個指令碼,它在迴圈中啟動多個後臺程序:

#!/bin/bash
for i in {1..5}
do
   sleep $i &
done
echo "Background processes started..."
wait
echo "All processes have completed!"

在這個指令碼中,我們使用迴圈在後臺啟動五個“sleep”命令。然後,我們向控制檯列印一條訊息,並使用 wait 命令等待所有後臺程序完成。一旦所有程序都完成,我們就向控制檯列印最終訊息。

將 wait 與命令替換一起使用

我們還可以將 wait 命令與命令替換一起使用。例如,假設我們有一個指令碼,它使用命令替換生成後臺程序列表:

#!/bin/bash
processes=$(for i in {1..3}; do sleep $i & echo $!; done)
echo "Background processes started: $processes"
wait $processes
echo "All processes have completed!"

在這個指令碼中,我們使用命令替換來生成後臺程序 ID 列表。我們使用迴圈啟動後臺程序,然後使用“echo $!”命令列印每個程序的程序 ID。然後,我們使用 wait 命令等待所有後臺程序完成,使用命令替換生成的程序 ID 列表。一旦所有程序都完成,我們就向控制檯列印最終訊息。

使用超時與 wait

wait 命令也可以與 timeout 命令一起使用,以限制我們等待程序完成的時間量。例如,假設我們有一個指令碼,它在後臺啟動一個長時間執行的程序,我們希望等待它完成,但我們也希望限制等待時間:

#!/bin/bash
sleep 20 &
echo "Command running in background..."
timeout 10s wait
if [ $? -eq 0 ]; then
echo "Command has completed!"
else
echo "Command timed out!"
fi

在這個指令碼中,我們在後臺啟動一個持續時間為 20 秒的“sleep”命令。然後,我們向控制檯列印一條訊息,並使用 timeout 命令將我們等待“sleep”命令完成的時間限制為 10 秒。如果“sleep”命令在時間限制內完成,我們將向控制檯列印一條訊息,指示它已完成。如果命令超時,我們將列印一條訊息,指示命令已超時。

將 wait 與 trap 一起使用

我們還可以將 wait 命令與 trap 命令一起使用,以處理訊號並在必要時終止後臺程序。例如,假設我們有一個指令碼,它啟動一個後臺程序,如果使用者按下 Ctrl+C,我們希望終止它:

#!/bin/bash
trap "kill %1" SIGINT
sleep 20 &
echo "Command running in background..."
wait
echo "Command has completed!"

在這個指令碼中,我們使用 trap 命令來處理 SIGINT 訊號,該訊號在使用者按下 Ctrl+C 時傳送。我們指定“kill %1”命令在接收到訊號時終止後臺程序。然後,我們在後臺啟動“sleep”命令,並使用 wait 命令等待它完成。一旦命令完成,我們就向控制檯列印一條訊息。

結論

Bash wait 命令是一個有用的工具,允許我們等待後臺程序完成。我們可以使用它來確保我們的指令碼以可預測和有序的方式執行,並在程序未按預期完成時處理錯誤。通過了解 wait 命令的基礎知識及其用法,我們可以提高 Bash 指令碼的可靠性和功能。

更新於:2023年4月12日

8K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.