сценарий оболочки busybox - сообщение об ошибке неизвестного операнда

Я думаю, проблема в порожденном процессе readline -. Он получает собственный канал для перенаправления, который закрывается, когда процесс останавливается (pid, который вы получаете, не тот, что у оболочки, а у процесса readlink -). Канал становится недействительным при завершении процесса. Попробуйте использовать fifos/именованные каналы.

2
27.06.2018, 17:19
2 ответа

Команда не возвращает свой статус выхода($?)в стандартном выводе. Подстановка команды($(...))фиксирует стандартный вывод.

Вместо этого просто

#!/bin/sh

if ! /usr/bin/python /etc/scripts/backup.py; then
   echo 'PROBLEM'
else
   echo 'OK'
fi

Это выберет первую ветвь и напечатает PROBLEM, если скрипт Python завершится с ненулевым -статусом выхода.

Вы можете прочитать оператор ifкак «Если сценарий не удался».

Если вы хотите избавиться от!:

#!/bin/sh

if /usr/bin/python /etc/scripts/backup.py; then
   echo 'OK'
else
   echo 'PROBLEM'
fi

Вы можете прочитать утверждение ifкак «Если скрипт выполнился успешно».


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

if [ -gt 0 ]

Это синтаксическая ошибка.

При цитировании подстановки команды вы, по сути, пытаетесь выполнить

if [ "" -gt 0 ]

и оболочка не может сравнить пустую строку как целое число.

6
27.01.2020, 21:58

Как показывает Кусалананда, вам просто нужно использовать

if cmd; then
    echo "command succeeded"
else
    echo "command failed: $?"
fi

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

$ if (exit 3); then echo succeeded ; else echo failed $?;fi
failed 3
$ if (exit 0); then echo succeeded ; else echo failed $?;fi
succeeded
$ 

Цикл while работает, как показано ниже:

$ i=3;while ! (exit $i); do echo failed $i; ((i--));done
failed 3
failed 2
failed 1
$ 

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

Использование (exit... )запускает эту команду как отдельный процесс. Для встроенных команд оболочки это необходимо для предотвращения выхода из экземпляра оболочки, выполняющего ваш скрипт. Вместо этого оболочка создает подпроцесс -, и его код выхода предоставляет значение $? как показано на справочной странице оболочки.

2
27.01.2020, 21:58

Теги

Похожие вопросы