如果引用的命令是准确的:
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 *仍然产生错误。也就是说,你的单引号变体工作正常。非常感谢。 –