PIPESTATUS[0] в скрипте BASH
Реализую сценарий в сценариях Unix Bash. У меня есть два скрипта ABC.bash и XYZ.bash. В ABC.bash есть одно условие, когда запрашивающая сторона не вводит Y или скрипты y, выходят с сообщением и не работают дальше. ABC.bash работает нормально при запуске в одиночку. Проблема возникает, когда я запускаю его из другого сценария bash, например XYZ.bash. Он не проверяет условия выхода. Синтаксис логики в XYZ.bash.
echo "Calling ABC.bash from XYZ.bash"
ABC.bash $a $b | tee -a $LOGFILE; sleep 2
if [ ${PIPESTATUS[0]} = 0 ]
then
echo "Do some work"
else
echo "Check ABC.bash input"
exit 1
fi
Но когда ABC.bash $a $b выходит со статусом 2, поток по-прежнему переходит в блок IF, а не в ELSE. В журнале я вижу сообщение, поскольку DEBUGMODE установлен в 0. Мне нужен этот параметр DEBUGMODE, поскольку он необходим, но я хочу выйти, если ABC.bash выйдет. В идеале он должен перейти в часть ELSE, так как ABC.bash выйдет с неправильным вводом пользователя.
Кроме того, я установил параметр DEBUGMODE в скрипте XYZ.bash. Подобно-
if [[ -z "$1" ]]
then
echo " ">> No input so default to 0"
DEBUGMODE=0
else
echo "DEBUGMODE set to $1"
DEBUGMODE=$1
fi
enter code here
3 ответа
Проблема в том, что PIPESTATUS
является изменчивой переменной. То есть он будет сброшен, как только будет выполнена любая другая команда. Вам нужно удалить звонок наsleep 2
если вы хотите осмотреть PIPESTATUS
.
В вашем примере PIPESTATUS отражает статус sleep 2
. Так что замените
ABC.bash $a $b | tee -a $LOGFILE; sleep 2
if [ ${PIPESTATUS[0]} = 0 ]
по
ABC.bash $a $b | tee -a $LOGFILE; pstat=(${PIPESTATUS[@]}); sleep 2
if [ ${pstat[0]} = 0 ]
сохранить статус.
Лучше всего заключить переменную в кавычки, если только ваш код не имеет полного контроля над содержимым любой переменной. Это не предотвратит логическую ошибку (например, дополнительный сон, который изменил PIPESTATUS), но позволит избежать случайной инъекции кода в скрипт (или неожиданных синтаксических ошибок).
if [ "${PIPESTATUS[0]}" = 0 ] ; then