Bash: цикл до тех пор, пока статус выхода команды не станет равен 0

У меня есть netcat, установленный на моем локальном компьютере, и служба, работающая на порту 25565. Используя команду:

nc 127.0.0.1 25565 < /dev/null; echo $?

Netcat проверяет, открыт ли порт, и возвращает 0, если он открыт, и 1, если он закрыт.

Я пытаюсь написать сценарий bash для бесконечного цикла и выполнять указанную выше команду каждую секунду, пока вывод команды не станет равным 0 (порт откроется).

Мой текущий сценарий просто продолжает бесконечно повторять «...» даже после открытия порта (1 становится 0).

until [ "nc 127.0.0.1 25565 < /dev/null; echo $?" = "0" ]; do
         echo "..."
         sleep 1
     done
echo "The command output changed!"

Что я здесь делаю не так?


person Snaacky    schedule 24.02.2014    source источник
comment
На самом деле вы не запускаете команду nc, это просто строка.   -  person Mark Setchell    schedule 24.02.2014
comment
Просто предложение, но пробовали ли вы использовать обратные галочки вместо двойных кавычек вокруг nc 127.0.0.1 25565 < /dev/null; echo $??   -  person csiu    schedule 24.02.2014


Ответы (2)


Будьте проще

until nc -z 127.0.0.1 25565
do
    echo ...
    sleep 1
done

Просто позвольте оболочке неявно обрабатывать статус выхода

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

Явно: status=$?, что допускает дальнейшую обработку.

Скрытый:

Для каждого утверждения, в уме, добавьте к команде слово "успех", а затем добавьте вокруг них конструкции if, until или while, пока фраза не станет понятной.

until nc успешно ; do ...; done


Параметр -z остановит nc чтение stdin, поэтому < /dev/null перенаправление не требуется.

person Henk Langeveld    schedule 24.02.2014

Вы можете попробовать что-то вроде

while true; do
    nc 127.0.0.1 25565 < /dev/null
    if [ $? -eq 0 ]; then
        break
    fi
    sleep 1
done
echo "The command output changed!"
person Lee Duhem    schedule 24.02.2014