了解如何使用Bash腳本正確運行子殼

如何指導子殼在後台並行運行

shell是在Linux系統上輸入命令的基本界面。 有了它,您可以直接輸入命令或指定一個包含要執行的命令序列的文件(腳本)。 shell按層次結構組織,任何shell都可以創建一個新的shell。 新的shell被認為是創建它的父shell的子進程 - 子shell。

默認情況下,如果父進程終止,則子shell依賴於其父進程,子進程也會終止。 任何輸出都從subshel​​l傳遞到父shell。

如何創建一個子殼

在Bash shell腳本中,使用括號表示法創建子shell:

#!/ bin / bash echo“開始子shell之前”(count = 1 while [$ count -le 99] do echo“$ count”sleep 1((count ++))done)echo“Finished”

在該示例中, while循環包含在括號中,這會導致它在執行腳本文件的shell的子shell中執行。

在後台運行子殼

除非您指定要在後台執行子shell,否則在繼續執行腳本的其餘部分之前,父shell會等待子shell完成。 但是,如果要並行運行子殼,則可以在後台運行它們,這是通過subshel​​l表達式後面的&符號來完成的,如下所示:

#!/ bin / bash echo“開始子shell之前”(count = 1 while [$ count -le 99] do echo“$ count”sleep 1((count ++))done)&echo“Finished”

並行運行多個子殼

如果您創建多個子殼體作為後台進程 ,則可以並行運行任務。 通常,操作系統為每個進程和子進程使用不同的處理器或內核,假定至少有與處理器一樣多的處理器或內核。 否則,任務將分配給相同的處理器或內核。 在這種情況下,處理器或內核會在指定的任務之間不斷切換,直到任務完成。 下一個例子有兩個子過程。 第一個從1到99,第二個從1000到1099。

#!/ bin / bash echo“開始子shell之前”(count = 1 while [$ count -le 99] do echo“$ count”sleep 1((count ++))done)&(count = 1000 while [$ count -le 1099] do echo“$ count”sleep 1((count ++))done)&echo“Finished”

使用wait語句告訴父進程等待子進程完成,然後繼續執行腳本的其餘部分:

#!/ bin / bash echo“開始子shell之前”(count = 1 while [$ count -le 99] do echo“$ count”sleep 1((count ++))done)&(count = 1000 while [$ count -le 1099] do echo“$ count”sleep 1((count ++))done)&wait echo“Finished”

用於Subshel​​ls

當需要在特定的環境或目錄中執行命令時,子殼很有用。 如果每個命令都在不同的子shell中執行,則不存在變量設置混淆的風險。 完成後,設置和當前目錄不需要恢復,因為父進程的環境不受其任何子進程的影響。

子函數可以在函數定義中使用,以便它們可以用不同的參數多次執行。