Bash

一個命令的 Shell 輸出作為其他命令的輸入

  • February 22, 2016

我正在嘗試自動化Forever JS 以保持我的開發伺服器執行,為此我需要檢查並停止永遠程序以啟動另一個程序。通過執行

sudo forever list

我得到以下輸出:

資訊:永遠執行的程序
數據:uid 命令腳本永遠**pid** id 日誌文件正常執行時間 
數據:[0] 0NQH /usr/bin/nodejs app.js 17047 **17049** /home/ubuntu/.forever/0NQH.log 0:2:4:58.594

從上面的輸出中,我需要目前為17049的****pid並將其提供給下一個命令,如下所示:

sudo forever stop {{pidfromabove}}

為了做到這一點,在我的腳本中我嘗試了很多東西,主要是試圖找到app.js和**/home**之間的兩個字元串,但由於某種原因它一直列印整行。我嘗試了 sed 和 awk 的不同組合。如何從上面獲取 pid 以提供給下一個stop命令?

這看起來像是awk. 如果您確定輸出格式穩定,因此您感興趣的 PID 始終是該行的第 7 個元素,這將列印 PID app.js

sudo forever list | awk '/app\.js/ { print $7 }'

您遇到的問題可能是因為輸出在 stderr 上,而不是在 stdout 上。如果是這種情況,您可以嘗試:

sudo forever list 2>&1 | sed 's/.*app.js [0-9]* \([0-9]*\) /\1/'

它應該只回答第二個 pid。

然後你可以這樣做:

sudo forever stop `sudo forever list 2>&1 | sed 's/.*app.js [0-9]* \([0-9]*\) /\1/'`

引用自:https://unix.stackexchange.com/questions/264990