Как получить Rscript для возврата кода состояния в неинтерактивном режиме bash - PullRequest
0 голосов
/ 14 июня 2019

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

Итак, у меня есть следующее содержимое в примере сценария .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» во всех других случаях?

очень ценим ввод!спасибо!

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Я решил проблему, вернув код состояния в дополнение к эхо.ниже приведен код, полученный из сценария sample.sh.Кроме того, в коде sample.R я добавил trycatch, чтобы перехватить ошибки и выйти (status = 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

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

0 голосов
/ 14 июня 2019

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

remote.sh:

#!/bin/sh
exit 1

Из локальногоmachine:

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

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

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

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

...