命令鏈:內聯或正在執行的程序
概述
有時您可能希望在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指令碼中使用命令鏈的常見方法——既包括內聯,也包括等待另一個指令碼完成後再繼續。還有更多選項和更大的靈活性可用。您可以使用這些技術來建立指令碼、函式、條件或迴圈。
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP