如果引用的命令是準確的:
watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss= | awk '{ i += $1 } END { print i }''
^ ^^ ^ ^^
1 0 1 0 10
你有你的單引號的問題。 1表示「開始報價」,0表示報價結束。下面的命令行應爲你工作:
watch -n 0.2 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk "{ i += $1 } END { print i }"'
^ ^
1 0
雙引號和$(...)
也正常工作。單引號字符串作爲一個整體發送到watch
。以前,你有多個參數。
注意,在你的工作命令,你必須:
watch -n 0.2 'ps -p $(pgrep -d',' -x snmpd) -o rss'
^ ^^ ^
1 0 1 0
現在,因爲中間的「01」之間的字符是一個逗號,不是空白,外殼繼續給watch
一個參數,但它不包含引號。得到什麼watch
作爲其第三個說法是:
ps -p $(pgrep -d, -xsnmpd) -o rss
有了您的awk
直插,1watch`遇到多個參數:
ps -p $(pgrep -d, -x snmpd) -o rss= | awk {
i
+=
$1
}
END
{
print
i
}
而且它不知道如何處理多餘的事情。 (注意:$1
的值將是shell的當前$1
(可能是一個空字符串,在這種情況下,對應於$1
的參數將被省略。)
這種變體,隨着awk
腳本$1
前一個反斜槓,似乎在爲我工作(當我看了這實際上是運行一個程序 - snmpd
沒有在機器上運行,我測試過,和崩潰的東西,因爲那):
sh -c 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk "{ i += \$1 } END { print i }"'
如果您認爲有任何危險,沒有snmpd
過程,那麼你需要做的事情有點不太緊湊。這是我測試的命令;您可以將watch -n 0.2
代替sh -c
。但要注意,對於watch
手冊頁也明確說:
注意command
賦於「sh -c
」這意味着你可能需要使用額外的報價,以獲得預期的效果。
這非常準確!
如果你願意堅持使用單引號,你可以嘗試:
watch -n 0.2 'ps -p $(pgrep -d"," -x snmpd) -o rss= | awk '\''{ i += $1 } END { print i }'\'
的'\''
主題背後的想法是,第一單引號終止當前的單引號的字符串;反斜槓單引號添加實際單引號,最後一個單引號開始新的單引號字符串。最後的'\'
也可以寫成'\'''
,但最後兩個單引號是多餘的,所以我把它們排除了。
謝謝你的努力JL。我喜歡雙引號的解釋和建議,這是合理的。 * awk *但是不喜歡使用雙引號,儘管...我迷失在這一個上。 –
我可以肯定的是,出錯的診斷是有針對性的。更換更難以確定。你說這是行不通的。但'$(pgrep ...)'的東西工作正常。 ['watch']的手冊頁(http://linux.about.com/library/cmd/blcmdl1_watch.htm)表示:_注意__命令_被賦予「sh -c」,這意味着您可能需要額外使用引用以獲得理想的效果._ –
好的。沒有給* watch *命令,* awk *不喜歡使用雙引號。所以當傳遞給watch * awk *仍然產生錯誤。也就是說,你的單引號變體工作正常。非常感謝。 –