Як правильно використовувати pgrep всередині bash script?


6

Я запускаю програму GUI під назвою zeal (зібрана з src) і додаю скрипт (zeal.sh) для виконуваного файлу:

#!/bin/bash

if pgrep zeal &>/dev/null; then
    printf "already on\n"
else
    ~/tools/zeal/zeal/zeal &>/dev/null &
fi

Дивна річ у тому, що коли я запускаю цей скрипт /path/to/zeal.sh, він завжди говорить "вже увімкнено", тоді як з bash /path/to/zeal.shним правильно вирішує, працює процес чи ні.

Я також перевірив інші програми GUI (наприклад, firefox) з аналогічними сценаріями, і вони добре працюють.

То як це може статися і як це виправити?

Відповіді:


3

Проблема полягає в тому, що прямий виклик робить сценарій ім'ям імені команди, див

cat /proc/$PID/comm

Це призводить pgrepдо відповідності. Якщо викликано через, bashтоді команда має назву "bash".

Використовуйте

pgrep --exact zeal

замість цього.


3

Довгий варіант, --exactзапропонований у відповіді Хауке, не працював у деяких системах. Ви можете -xзамість цього використати еквівалентний короткий варіант .

#!/bin/bash

if pgrep -x "zeal" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

І якщо ви отримаєте помилку "очікується, що оператор pgrep очікується", не забудьте залишити квадратні дужки в операторі "if". Поширена помилка новачка. :)
Тейлор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.