bash выполняет команду в переменной

#linux #bash #shell #variables #command

#linux #bash #оболочка #переменные #команда

Вопрос:

У меня есть команда в переменной в Bash:

 check_ifrunning=`ps aux | grep "programmname" | grep -v "grep" | wc -l`
  

Команда проверяет, запущена ли определенная программа в данный момент.
Позже в моем скрипте я хочу запросить значение переменной в точке.
Если запущена конкретная программа, скрипт должен находиться в режиме ожидания в течение 15 минут.

Я решил это следующим образом:

 while [ $check_ifrunning -eq 1 ]; do
sleep 300
done
  

Будет ли скрипт выполнять команду в переменной для каждого отдельного цикла запуска или значение в переменной останется после первого выполнения?

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

Ответ №1:

Обратите внимание, что check_ifrunning задается только один раз, в

  check_ifrunning=`ps aux | grep "programmname" | grep -v "grep" | wc -l`
  

и что она устанавливается перед циклом:

  while [ $check_ifrunning -eq 1 ]; do
   sleep 300
 done
  

Вы могли бы добавить, в целях отладки, echo check_ifrunning is $check_ifrunning инструкцию внутри вашего while цикла непосредственно перед sleep

Вероятно, вы просто хотите (используя pidof(8)) — без определения или использования какой-либо check_ifrunning переменной Bash:

  while [ -n "$(pidof programname)" ]; do
    sleep 300
 done
  

Потому что вы хотите проверить, выполняется ли programname при каждом запуске цикла!

Вам следует использовать более вложенный и более читаемый вариант $( ) вместо обратных кавычек.

Подумайте о том, чтобы прочитать руководство по написанию расширенных сценариев Bash

Если вы пишете скрипт Bash, подумайте о том, чтобы запустить его с

  #!/bin/bash -vx
  

во время отладки. Когда вы будете удовлетворены, удалите -vx

Комментарии:

1. Прежде всего, спасибо за ответ. Значит, я должен «переустанавливать» переменную каждый раз перед циклом? Возможно ли это с помощью функции, которую я вызываю перед каждым циклом? Как уже упоминалось, в моем скрипте есть больше подобных переменных. Они могут меняться во время выполнения скрипта.

2. Узнайте больше о сценариях bash. Используйте -vx трюк. Вы, кажется, очень смущены тем, какие переменные есть в bash….

Ответ №2:

Если вы хотите инкапсулировать свои команды, правильный способ сделать это — функция.

 running () {
    ps aux | grep "$1" | grep -q -v grep
}
  

С помощью grep -q вы получаете результат как код выхода, а не как выходные данные; вы используете его просто как

 if running "$programname"; then
    :
  

В идеале второе grep не требуется, но я не хотел слишком усложнять код. Она по-прежнему не будет работать корректно, если вы ищете grep . Правильное решение таково pidof .

Смотрите также http://mywiki .wooledge.org/BashFAQ/050