Как заставить Rscript возвращать код состояния в неинтерактивном режиме bash

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

Итак, у меня есть следующее содержимое в скрипте sample.sh:

Rscript --verbose --no-restore --no-save /home/R/scripts/sample.r >> sample.rout

когда этот sample.sh запускается, он всегда возвращает код состояния 0, независимо от того, выполняется ли сценарий sample.r полностью или возникает ошибка на промежуточном этапе.

Я пробовал следующие вещи, но не повезло

1 — в файле sample.sh я добавил условие if и else для кода возврата, как показано ниже, но он снова записал 0, несмотря на то, что sample.r не выполнил одну из функций внутри.

if Rscript --verbose --no-restore --no-save /home/R/scripts/sample.r >> sample.rout
then
  echo -e "0"
else
  echo -e "1"
fi

2 - Я также пробовал скрипт-оболочку, как в файле sample.wrapper.sh

r=0
a=$(./sample.sh)
r=$?

echo -e "\n return code of the script is: $a\n"
echo -e  "\n The process completed with status: $r"

здесь также я не получил ожидаемую «1» в случае отказа sample.r на промежуточном шаге по обеим переменным a и r. В идеале мне нужен способ зафиксировать ошибку (как «1») в a.

Может ли кто-нибудь посоветовать, как заставить rscript писать «0» только в случае завершения всего скрипта без каких-либо ошибок и «1» во всех остальных случаях?

высоко ценим вклад! Спасибо!


person S2850951    schedule 13.06.2019    source источник
comment
Помогает ли это: stackoverflow.com/questions/7681199/   -  person Stewart Macdonald    schedule 14.06.2019
comment
На что похож ваш Rscript? Если я запускаю Rscript для файла с неизвестными функциями/неправильным синтаксисом, я вижу ожидаемый код выхода 1   -  person Rorschach    schedule 14.06.2019
comment
@jenesaisquoi my Rscript — это процесс, который, среди прочего, включает в себя выборку данных из базы данных db2, выполнение вычислений и запись данных обратно в базу данных db2. моя проблема в том, что если процесс завершается с ошибкой на любом из шагов, R записывает ошибку обратно в консоль, и она тут же заканчивается. но код возврата, который он пишет, по-прежнему равен «0». но я бы ожидал, что код возврата «1» в случае какой-либо ошибки в процессе.   -  person S2850951    schedule 14.06.2019
comment
@StewartMacdonald Я проверил этот пост ранее, я не уверен, как заставить его работать для моего варианта использования.   -  person S2850951    schedule 14.06.2019


Ответы (2)


Я решил проблему, вернув код состояния в дополнение к эхо. ниже приведен код, вырезанный из сценария sample.sh. Кроме того, в коде sample.R я добавил trycatch для обнаружения ошибок и выхода (статус = 1).

function fun {

if Rscript --verbose --no-restore --no-save /home/R/scripts/sample.r > sample.rout 2>&1
then
  echo -e "0"
  return 0  
else
  echo -e "1"
  return 1
fi

}

fun

спасибо всем за ваш вклад.

person S2850951    schedule 14.06.2019

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

удаленный.ш:

#!/bin/sh
exit 1

С локальной машины:

ssh -l username remoteip /home/username/remote.sh
echo $?
1

Но удаленный скрипт также должен предоставить вам статус выхода последней выполненной команды. Поэкспериментируйте дальше, изменив удаленный скрипт:

#!/bin/sh
#exit 1
/bin/false

Статус выхода удаленной команды теперь также будет 1.

person ennox    schedule 14.06.2019