命令鏈:內聯或正在執行的程序


概述

有時您可能希望在Linux中順序執行多個命令。為此,您可以使用命令鏈。例如,如果您想下載一個壓縮存檔,解壓縮它,然後從磁碟中刪除生成的存檔,您可以將這三個命令一起輸入。

在這裡,我們將瞭解一些使用Linux中的Bash序列化命令的方法。即使它們已經在執行。

內聯命令鏈

Bash為終端使用者提供了極大的靈活性和強大的功能。我們可以建立長指令序列來執行任意數量的任務。

<command1> <arguments1> <連結運算子> <command2> <arguments2> ...

鏈式操作包括幾種常見的操作,因此我們將在這裡介紹它們。

  • ; (分號) − 右側的命令總是在左側命令之後執行,即使左側命令失敗也是如此。

  • & (與號) − 左側是“後臺執行”選項;右側是“立即啟動”選項。

  • | (管道) − 左側命令的標準輸出連線到右側命令的標準輸入。

  • && (AND) − 如果左側命令成功,則執行右側命令。否則,不執行右側命令。

  • || (OR) − 如果左側命令執行成功(返回零),則執行右側命令。

您還可以將語句括在括號中以在子shell中執行它們。

( <command1> && <command2> ) & ( <command3> && <command4> ) &

這兩個命令將一個接一個地執行。在每個命令中,第二個結果決定最後一個結果。

使用已執行程序的命令鏈

我們將研究如何使用Wait()函式在已經啟動一個shell指令碼後執行第二個shell指令碼。這是對稱為Wait()的系統呼叫的包裝器。

在不帶任何引數執行時,它等待當前shell的所有後臺程序。如果沒有給出引數,它將掛起shell,直到所有程序完成。

您可以使用pidsof命令獲取所有具有相似名稱的正在執行程序的程序ID (PID)。假設我們要執行三個後臺10秒sleep命令,然後檢查哪些命令成功了。我們可以輸入:

$ sleep 10 &
[1] 26176

$ sleep 10 &
[2] 26178

$ sleep 10 &
[3] 26179

$ wait $(pidof sleep) && echo Waited for 3 10-second sleeps
[1]     Done          sleep 10
[2]-    Done          sleep 10
[3]+    Done          sleep 10
Waited for 3 10-second sleeps

您可以透過將多個命令組合成一個命令來獲得相同的結果。例如,您可以使用以下命令序列:ps -ef | grep -v 'string'。

$ wait $(ps -ef | grep <process name> | tr -s ' ' | cut -f 2 -d ' ' ) && echo Waited for 3 10-second sleeps

命令鏈顯示了將多個操作連結在一起的另一種方法。$()函式告訴我們括號內程式碼的輸出將用作wait函式的引數。在我們的例子中:

  • ps −ef − 收集所有包含詳細資訊的程序

  • grep <程序名稱> − 從ps −ef輸出中選擇包含<程序名稱>的行

  • tr −s ‘ ‘ − 從grep的輸出中刪除任何重複出現的' '(空格)

  • cut −d ‘ ‘ −f 2 − 透過指定空格字元作為分隔符,從tr輸出中選擇第二列。例如,如果我們使用ps −ef | grep java列出系統上所有正在執行的程序,然後僅過濾出其父PID與上一步中PID匹配的程序。

wait命令的限制

對於WAITTEST_TIMEOUT變數,WAITTIME返回程式開始等待指定命令的時間。但是,如果我們依賴於已完成命令的PID,則它不可靠,例如,它無法返回其實際結果。如果應用程式返回的錯誤程式碼大於128,則無法判斷應用程式是由於訊號終止還是自行終止。

最後,`sleep`的一個限制是它只能休眠在同一shell上啟動的程序。如果我們需要執行其他使用者的程序或在其他shell中開啟,則必須使用其他不太直接的方法,例如pidof迴圈。

while ( pidof -q <command_to_wait> ); do sleep 1; done && <command_to_execute_after>

Wait是sleep的更通用但功能較弱的替代方案。它依賴於特定的休眠週期,並且無法評估目標操作的結果。在shell指令碼中迭代之間使用sleep很重要,因為它會將CPU時間返還給系統。特別是如果指令碼結束得太快。

結論

我們已經看到了一些在shell指令碼中使用命令鏈的常見方法——既包括內聯,也包括等待另一個指令碼完成後再繼續。還有更多選項和更大的靈活性可用。您可以使用這些技術來建立指令碼、函式、條件或迴圈。

更新於:2022年12月26日

瀏覽量:343

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.