2011-09-17 6 views
3

나는 아주 간단한 것을 시도하고 있으며, 많은 문제가있다.PID를 bash로 비교하기

나는 pstree와 비슷한 기능을 수행하는 클래스 용으로 작성해야하는 bash 스크립트가있다. 그것 자체에 대한 pstree를보고합니다.

PID 
| 
PPID 
| 
. 
. 
. 
| 
1 

가 여기에 지금까지 내 코드는 다음과 같습니다 : 그것은 실패한 것

ps -ef>tmp1.txt     #save ps -ef to a file 
pid=$$  
echo $pid       #print first PID 
while [ $pid != "1" ] 
do 
    cat tmp1.txt | while read line #read in ps -ef file line by line 
    do 
     tmp=$(echo $line | cut -f2 -d' ') #return only the PID column of ps -ef 
     if [$pid == $tmp]     #compare current PID to temp PID of current line 
     then 
      echo "|" 
      pid=$(echo $line | cut -f3 -d' ') #if they're the same we found the PPID, so save it 
      echo $pid       #and echo it 
     fi 
    done 
done 

는 비교 문에 있습니다 : 출력과 같아야합니다

if [$pid == $tmp] 

내가없는 오류가 발생합니다. 왜 비교가 효과가 없는지 아이디어가 있습니까? 사전에 도움을 주셔서 감사 드리며 무엇이든지 명확히 설명해 주시면 알려주세요.

답변

4

단일 등호가 문자열 비교에 사용됩니다 (if [ $pid = $tmp ]).

+3

그리고'['와']'문자 주위에 공백이 필요합니다. –

+0

@Keith : 맞아, 고마워, 나는 그것을 정확하게 썼다. 그러나 그것을 지적하지 않았다. –

+0

좋아, 그 변경 사항을 추가하고 그 뒤에 세미콜론을 추가했습니다. 아직도 완전히 작동하지는 않지만 나는 진전을 이루고 있습니다. 고마워요 – Casbar77

2

질문을 편집하여 코드를 들여 씁니다. 각 while 및 if 문을 들여 쓰기하면 훨씬 쉽게 읽을 수 있습니다.

당신에 대해 불평하고 선은 몇 가지 이유가 이미 지적에 대해 무효입니다

if [$pid == $tmp] 

입니다. 다른 프로그래밍 언어와 달리 BASH는 등호 하나를 사용하므로 대괄호 주위에 공백을 두어야합니다. 대괄호는 명령이며 공백으로 구분해야합니다. test 명령의 별명입니다. [이를이기 때문에,

if [ $pid -eq $tmp ] 

을 그리고 :이 줄은 다음과 같아야합니다 : 당신이 숫자 비교를하고 있다면 지금

if [ $pid = $tmp ] 

, = 문자열 비교는, 대신 -eq를 사용해야합니다 test 명령 별칭, 다음과 같이 작성 (하지만 거의 없음) 수 : 왜 N

if test $pid -eq $tmp 

그러나, 당신을 보여 않습니다 대괄호 주위에 공백이있다.

+0

피드백을 보내 주셔서 감사 드리며 코드를 들여 씁니다. 들여 쓰기의 부족은 복사 및 붙여 넣기 문제였습니다.나는 너무 많은 환경 사이를 이동하면서 그들을 다시 추가하는 것을 잊어 버렸다. – Casbar77

0

코드가 효율적이지 않습니다. 임시 파일 및 중첩 루프없이, AWK와 시도 : 내 마지막 코드는 다음과 같습니다 관심이의 사람들을 위해

ps -eo pid,ppid | awk -v START=$$ ' 
{ PPID[$1]=$2 } # (for each line) create PPIDs table record 
END { if (PPID[START]) { # (when done) if starting pid is correct 
    for(pid=START; pid!=1; pid=PPID[pid]) # print the tree 
     printf "%d\n|\n", pid; 
    print 1; 
    } 
}' 
+0

비효율적이라는 것을 알고 있습니다. 이런 식으로 코딩해야했습니다. 그러나 나는 당신에게 동의합니다. awk 안에서 모든 작업을 수행하는 것이 좋습니다. – Casbar77

0

을 : 거기에 당신의 모든 제다이 마스터에

echo $pid 
while [ $pid != "1" ] 
do 
    while read line 
    do 
      tmp="$(echo $line | cut -f2 -d' ')" 
      if [ $pid = $tmp ]; 
      then 
       pid="$(echo $line | cut -f3 -d' ')" 
      fi 
    done<./tmp1.txt 
    echo "|" 
    echo $pid 
done 

감사합니다.

+0

임시 파일을 피할 수 있습니다 (항상 번거롭지는 않지만 정상적인 성공 사례에서도 파일을 삭제하지 않는 것 같습니다). 그리고'read'에서 분할하십시오. 'ps -ef | 읽는 동안 p p 휴식; $ p 안에 case $ pid를한다.) pid = $ pp ;; esac; 완료 ' – tripleee