2017-01-11 7 views
-4

Я новичок в unix-like. И я встретил странную проблему, которую я действительно не могу найти, отвечая на поиски.команда ps в linux

#!/bin/bash 
me=`basename "$0"` 
echo $(ps -e | grep "$me" | wc -l) 
ps -e | grep "$me" | wc -l 

После выполнения этого Баш скрипт, эхо показывает мне 2, а пс просто показывает мне 1, которая является то, что я хочу. Как это может произойти? Почему эхо показывает мне дополнительный процесс?

+1

Подробнее: [Более элегантный »ps aux | grep -v grep "] (http://stackoverflow.com/q/9375711/3776858) – Cyrus

+2

' $() 'создает подоболочку - раздвоенную копию вашей оболочки. Таким образом, пока вы используете 'echo $ (ps -e | grep) $ me" | wc -l) ', на самом деле есть еще * процессы, которые соответствуют вашему выражению. –

+0

Это говорит о том, что grepping через 'ps' является абсолютно плохой практикой и не должен выполняться для какого-либо автоматизированного использования. Хотя существуют такие инструменты, как 'pgrep' и такие, которые работают над некоторыми предостережениями, если вы намерены определить, запущена ли программа, есть гораздо лучшие способы сделать это. –

ответ

1

Как указал Чарльз Даффи, $() creates a subshell. Это отвечает на мой вопрос. По-видимому, мне еще многое предстоит узнать. Спасибо за помощь.

0

Как отмечено в комментарии Кира; этот скрипт:

me=$(basename $0) 
ps -ef |grep $me 

при запуске с "./ps.sh", печатает:

[email protected]:/tmp$ ./ps.sh 
auser  4425 4422 0 08:42 pts/3 00:00:00 grep ps.sh 
[email protected]:/tmp$ 

Нет Подоболочки не участвуют здесь, это Grep (1) сама по себе, что перечислен пс (1). Тот же сценарий, запущенный с «Баш ps.sh» выходов:

auser  4426 3946 0 08:44 pts/3 00:00:00 bash ps.sh 
auser  4429 4426 0 08:44 pts/3 00:00:00 grep ps.sh 

Это результат ОП получает, даже без подоболочек. Еще более явными являются:

[email protected]:/tmp$ ps -ef |grep grep 
auser  4467 3946 0 08:49 pts/3 00:00:00 grep grep