Возврат кода завершения из сценария оболочки, который был вызван из сценария perl - PullRequest
1 голос
/ 27 сентября 2011

У меня есть сценарий perl (verifyCopy.pl), который использует system() для вызова сценария оболочки (intercp.sh).

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

Я пытался использовать $?, я пытался присвоить значение system("./intercp.sh") переменной, а затем проверять ее значение, но сообщение об ошибке всегда равно 0.

Это потому, что даже если что-то внутри сценария оболочки дает сбой, фактический сценарий успешно запускается?

Я попытался добавить ловушку в сценарий оболочки (например, trap testexit EXIT и testexit() { exit 222; }, но это тоже не сработало.

1 Ответ

0 голосов
/ 27 сентября 2011

$? должен перехватить код выхода из вашего сценария оболочки.

$ cat /tmp/test.sh 
#!/bin/sh
exit 2

$ perl -E 'system("/tmp/test.sh"); say $?'
512

Помните, что $? кодируется традиционным способом, поэтому $? >> 8 дает код выхода, $? & 0x7F даетсигнал, и $? & 0x80 истина, если ядро ​​было сброшено.Подробности смотрите в perlvar.

Ваша проблема может быть одной из нескольких: возможно, ваш сценарий оболочки на самом деле не завершается с кодом выхода (может быть, вы хотите set -e);возможно, у вас есть дескриптор сигнала для SIGCHLD, поедающего код выхода;и т. д. Попробуйте выполнить тестирование с помощью чрезвычайно простого сценария оболочки, описанного выше, чтобы выяснить, не является ли это проблемой в вашем сценарии perl или в сценарии оболочки.

...