Esto debería funcionar:
for i in *.pks;do
i=${i%.pks}
sqlplus -s @user << EOF
WHENEVER SQLERROR EXIT SQL.SQLCODE;
SET LINES 255
SET PAGES 0
SET FEEDBACK OFF
SET ECHO OFF
SET PAGESIZE 0
SET TIMING OFF
SET SERVEROUTPUT ON
SET TERM ON
ALTER PACKAGE $i COMPILE PACKAGE;
EOF
if [ $? -ne 0 ]; then
echo "error"
exit 1
fi
done
Acabo de mover el comando sqlplus
fuera de la función y puse if [ $? -ne 0 ]
después, por lo que debería salir si sqlplus
no devuelve cero. El script que publicó tenía if [ $? -ne 0 ]
después del comando echo
, que devolvería 0
.
También cambié el comando ls
por un comando find
, ya que normalmente no es una buena idea analizar ls
.
Editado según el comentario de ilkkachu.
Ничего из того, что вы пробовали, не должно влиять на статус выхода. Вы можете протестировать этот очень простой скрипт:
#!/bin/sh
echo out
echo err >&2
exit 139
Теперь выполните его с различными редиректами:
$ foo.sh; echo $?
out
err
139
#redirect stdout to /dev/null and stderr to a file called '1'
$ foo.sh >/dev/null 2>1; echo $?
139
## Redirect stderr to /dev/null
$ foo.sh 2>/dev/null; echo $?
out
139
Способ перенаправления stderr команды просто command 2>/dev/null
, но это никогда не должно влиять на статус выхода команды, если только перенаправление не завершается ошибкой. Именно это, вероятно, и произошло в вашем случае. Если у вас нет разрешений на запись в каталоге, в котором вы находитесь, и вы попытались запустить./segf >/dev/null 2>1
(вместо ./segf >/dev/null 2>&1
), это попыталось бы создать файл с именем 1
для перенаправления stderr на. Если файл не может быть создан, вы получите статус выхода 1
:
$ foo.sh 2>1; echo $?
bash: 1: Permission denied
1