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 
Другие вопросы по тегам