Иногда скрипт Bash работает, иногда нет ... - PullRequest
0 голосов
/ 03 декабря 2018

У меня странная ситуация, когда Bash, похоже, неправильно назначает одну из моих переменных, или это может быть связано с конвейерами.Я честно не уверен.Вот код:

test=0

if [ "$#" -ne 4 ]; then
    echo "Error: You have passed an incorrect number of parameters" > client.pipe
    test=1 

if [ $test -eq 1 ]; then <-------THIS SOMETIMES DOESN'T EXECUTE
    echo "end_result" > client.pipe
    exit 1

Здесь происходит следующее: это серверный скрипт для команды: 'select'.

Команда select принимает 4 параметра: идентификатор (для указания канала, на который выводятся сообщения), имя базы данных, имя таблицы, а затем строка идентификаторов столбцов.

На другом конце клиентского канала клиентский сценарий прослушивает сообщения, и если он получает 'end_result', он прекращает прослушивание.Как вы можете видеть, что бы ни случилось, 'end_result' должен быть отправлен обратно в канал и напечатан клиентским скриптом, но иногда этого не происходит, и я зацикливаюсь на бесконечном цикле while.Вот клиентский скрипт, чтобы вы могли увидеть, где происходит «прослушивание».

     while true; do
        read message < client.pipe
           if [ "$message" == "end_result" ]; then
              echo $message 
              break
           else
              echo $message
           fi
       done

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

Я был бы очень признателен, если бы кто-нибудь мог понять, в чем проблема, и я с радостью предоставлю больше информации о коде, если потребуется.

Большое спасибо, R

EDIT:

Я почти уверен, что проблема заключается в чтении из клиентского канала и цикла while, как будто что-то получалосьзастрял в трубе ...

1 Ответ

0 голосов
/ 03 декабря 2018

Это было решение, предоставленное @WilliamPursell:

 while true; do
        read message 
           if [ "$message" == "end_result" ]; then
              echo $message 
              break
           else
              echo $message
           fi
       done < client.pipe
...