Вам нужно указать EOF
токен.В противном случае переменные в here-doc расширяются исходной оболочкой, поэтому $?
содержит состояние выхода последней команды, которую вы выполнили до su
.
# shell script
su ossadm <<'EOF'
. /opt/oss/manager/bin/engr_profile.sh # which only can be executed by ossadm
python "${SRC_DIR}"/main.pyc
status=$?
echo $status
if [[ $status = 0 ]]; then
echo "success"
else
echo "failure: $?"
fi
EOF
Если SRC_DIR
- это переменная, установленная в исходной оболочке, убедитесь, что вы экспортировали ее, чтобы она была унаследована оболочкой, запущенной su
, поскольку она больше не будет расширятьсяоригинальная оболочка.Но если он установлен на engr_profile.sh
, кавычка токена заставит его правильно раскрыться.
Причина, по которой вы получаете 1
и success
во второй версии, заключается в том, что оператор echo
устанавливает $?
основано на собственном успехе.Если вы хотите напечатать состояние выхода, а также протестировать его, вам нужно сохранить его в другой переменной, как я сделал с переменной status
выше.