2017-01-11 1 views
-4

나는 유닉스 계열의 초보자입니다. 그리고 나는 검색으로 정말 답을 찾을 수없는 이상한 문제를 만났습니다.리눅스에서 ps 명령

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

해당 bash 스크립트를 실행 한 후 에코는 2를 표시하고 ps는 내가 원하는 것을 1로 표시합니다. 어떻게 될 수 있습니까? 왜 에코는 나에게 추가적인 과정을 보여 줍니까?

+1

참조 : [더 우아한 "ps aux | grep -v grep "] (http://stackoverflow.com/q/9375711/3776858) – Cyrus

+2

'$()'는 쉘의 분기 된 사본 인 서브 쉘을 만듭니다. 그래서'echo $ (ps -e | grep "$ me"| wc -l)'을 실행하고있을 때 실제로 당신의 식과 일치하는 * 더 많은 프로세스가 실행되고 있습니다. –

+0

그런데'ps '를 통해 grepping하는 것은 절대적으로 나쁜 습관이며 어떤 종류의 자동화 된 사용을 위해해서는 안됩니다. 'pgrep'과 같은 도구가 있지만 일부주의 사항을 해결할 수있는 도구가 있지만 프로그램이 이미 실행 중인지 여부를 확인하려는 것이면 훨씬 더 좋은 방법이 있습니다. –

답변

1

Charles Duffy가 지적한대로 $() creates a subshell. 그건 내 질문에 대한 답변. 분명히 나는 ​​아직도 배울 것이 많다. 모든 도움에 감사드립니다.

0

Cyrus의 의견에 의해 언급 됨. 이 스크립트 :

"./ps.sh"로 시작
me=$(basename $0) 
ps -ef |grep $me 

, 지문 :

없음 서브 쉘이 여기에 포함되지 않습니다
[email protected]:/tmp$ ./ps.sh 
auser  4425 4422 0 08:42 pts/3 00:00:00 grep ps.sh 
[email protected]:/tmp$ 

, 그것은 (1) 자체 PS에 의해 나열된 그렙입니다 (1). "bash는 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 
관련 문제