Сравнение PID в Bash - PullRequest
       21

Сравнение PID в Bash

3 голосов
/ 18 сентября 2011

Я пытаюсь сделать что-то очень простое, и у меня много проблем с этим.

У меня есть скрипт 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]

Iполучить не найденную ошибку.Есть идеи, почему сравнение не работает?Спасибо за любую помощь заранее, и если я могу что-то уточнить, пожалуйста, скажите мне.

Ответы [ 4 ]

4 голосов
/ 18 сентября 2011

Для сравнения строк используется один знак равенства (if [ $pid = $tmp ]).

2 голосов
/ 18 сентября 2011

Я отредактировал ваш вопрос, чтобы сделать отступ для кода. Гораздо проще читать, когда вы делаете отступы в операторах while и if.

Строка, на которую вы жалуетесь, -

   if [$pid == $tmp]

Это неверно по нескольким причинам, уже указанным. В отличие от других языков программирования, BASH использует один знак равенства, и вы должны оставить пробел в квадратных скобках. Квадратная скобка является командой и должна быть отделена пробелами. Это псевдоним для команды test. Эта строка должна выглядеть так:

   if [ $pid = $tmp ]

Теперь = - это сравнение строк, если вы проводите числовое сравнение, вы должны использовать -eq вместо:

   if [ $pid -eq $tmp ]

И, поскольку [ является псевдонимом команды test, его можно записать так (но редко бывает):

   if test $pid -eq $tmp

Тем не менее, он показывает, почему вам нужно пространство вокруг квадратных скобок.

0 голосов
/ 19 сентября 2011

Для тех из вас, кто интересуется, мой окончательный код выглядит следующим образом:

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 голосов
/ 19 сентября 2011

Ваш код не эффективен.Попробуйте с 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;
  }
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...