Если цитируемая команда точна:
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
}
И он не знает, что делать с избытком. (NB: значение $1
будет текущим значением оболочки $1
(возможно, пустая строка, и в этом случае аргумент, соответствующий $1
, будет опущен.)
Этот вариант, с помощью обратной косой черты перед $1
в awk
сценарий, казалось, работал для меня (когда я искал программу, которая на самом деле была запущена - 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 ...) работал нормально. На странице man для ['watch'] (http://linux.about.com/library/cmd/blcmdl1_watch.htm) говорится: _Примечание, что__используется для команды« sh -c », что означает, что вам может потребоваться дополнительное использование цитируя, чтобы получить желаемый эффект. –
ОК. Без указания команды * watch *, * awk * не нравится использование двойных кавычек. Поэтому при передаче на экран * awk * все еще возникает ошибка. Тем не менее, ваш вариант с одиночной кавычкой работает нормально. Большое спасибо. –