Перенаправления и коды возврата

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 sqlplusfuera de la función y puse if [ $? -ne 0 ]después, por lo que debería salir si sqlplusno 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 lspor un comando find, ya que normalmente no es una buena idea analizar ls.

Editado según el comentario de ilkkachu.

2
05.06.2019, 15:56
1 ответ

Ничего из того, что вы пробовали, не должно влиять на статус выхода. Вы можете протестировать этот очень простой скрипт:

#!/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
3
27.01.2020, 22:08

Теги

Похожие вопросы