Hi there,
This is the expected behavior, implemented in `org-babel-eval`. (By the way, the docline of `org-babel-sh-evaluate` seems to talk about a different function.)
As a workaround, you could define a new shell that always returns 0:
(push "0bash" org-babel-shell-names)
(org-babel-shell-initialize)
(defun org-babel-execute:0bash (body params)
"Execute a block of bash commands with Babel, returning 0."
(let ((shell-file-name "bash"))
(org-babel-execute:shell (concat "trap 'exit 0' EXIT\n" body) params)))
—This is called 0bash because there are special treatments if the shell name ends with "bash", see `org-babel--variable-assignments:bash`.
Cheers,
M.