Оболочка Bash Делает цикл While бесконечным циклом?

#linux #bash #shell #while-loop #do-while

#linux #баш #оболочка #while-цикл #делать-пока

Вопрос:

По сути, это мой код:

 bay=$(prog -some flags)
while [ $bay = "Another instance of this program is running, please exit it first" ]
do
echo "Awaiting Access to program"
do
.....
 

У меня есть программа, которая позволяет запускать только один экземпляр одновременно из-за того, как она взаимодействует с моим оборудованием, когда запускается другой экземпляр, он выдает следующее сообщение «Запущен другой экземпляр этой программы, пожалуйста, сначала выйдите из него».

Мне нужно иметь возможность запускать несколько скриптов, которые будут использовать эту же программу, поэтому я решил использовать приведенный выше код. Моя проблема в том, что когда я запускаю свои два скрипта, один получит доступ к программе и запустится по желанию, но другой заметит ошибку, а затем застрянет в бесконечном цикле, повторяющем «Ожидание доступа к программе».

Вы что-то пропустили? Выполняет ли оператор команду CLI или просто возвращается к своему первоначальному выполнению? Или моя проблема в другом месте?

Ответ №1:

Вы где-то не обновляете свою bay переменную внутри цикла. Он устанавливается один раз и остается неизменным. Вам нужно пересчитывать его каждый раз.

Либо устанавливается bay внутри цикла, либо в состоянии while.

 while [ `prog -some flags` = "Another instance of this program is running, please exit it first" ]
 

Редактировать:

Из вашего комментария вы хотите иметь возможность ссылаться на этот вывод позже. Вы можете вернуться к тому, что у вас было, но внутри вашего цикла блокировки поместите свою bay=$(prog -some flags) команду внутрь цикла. Он останется для вас, чтобы использовать его позже.

 bay=$(prog -some flags)
while [ $bay = "Another instance of this program is running, please exit it first" ]
do
echo "Awaiting Access to program"
bay=$(prog -some flags)
done
.....
 

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

1. Есть ли какой-либо способ вызова переменной в операторе If Else, который будет следовать за этим? или я должен просто запустить новую переменную?

2. Я обновил свой ответ, чтобы дать совет в вашем новом требовании.

Ответ №2:

Более СУХОЙ и вместо того, чтобы забивать прогу, я бы подождал, пока пользователь сначала что-нибудь сделает:

 while true
do
  bay=$(prog -some flags)
  case "$bay" in
    "Another instance of this program is running, please exit it first")
      read -p "Awaiting Access to program. Close it and hit enter: " x ;;
    *) break ;;
  esac
done
echo "Results: $bay"