2013-11-12 2 views
0

Если я запускаю следующую команду из командной строки, он работает, как ожидалось: -Вызов команды Баша с -c и централизованной строкой для AWK

ps -eo pid,command | grep -v bash | grep syslogd | awk '{print $1}' 

Выход только PID процесса SyslogD. Согласно страницам man для bash, использование аргумента -c позволяет передавать строку команд. Итак, я попытался это: -

/bin/bash -c "ps -eo pid,command | grep -v bash | grep syslogd | awk '{print $1}'" 

Вместо печати только Pid процесса SyslogD, путь к SyslogD также напечатал: -

19 /usr/sbin/syslogd 

Может кто-нибудь объяснить, почему это и если он можно вызвать команду с помощью bash таким образом, чтобы она действовала так же, как при непосредственном вызове команд и только распечатке pid процесса?

+2

Как и в сторону, правильный способ написать это 'ps -eo pid, команда | awk '!/bash/&&/syslogd/{print $ 1}' '. См. Также http://partmaps.org/era/unix/award.html#grep – tripleee

+0

@ отличное имя (!) И спасибо; O) – TheDarkKnight

ответ

6

$1 интерпретируется внешней оболочкой, потому что она находится в двойных кавычках. Вам нужно будет избежать этого с помощью обратной косой черты.

/bin/bash -c "ps -eo pid,command | grep -v bash | grep syslogd | awk '{print \$1}'" 

Кстати, на Linux, вы можете заменить все это с pgrep:

$ pgrep syslogd 
25855 
+1

Блестяще и спасибо. pgrep также доступен для OSX; O) – TheDarkKnight

1

Это также должно работать

pidof syslogd 
+0

Он недоступен в OSX, но интереснее то, что на моем CentOS-сервере он указывает команду «не найден», хотя для этой команды есть man-страницы. – TheDarkKnight

Смежные вопросы