LD_LIBRARY_PATH
zmienna środowiskowa musi być ustawiona przed Twój program się uruchomi — przed perl
sam jest załadowany. Zmiana w BEGIN{}
wpłynie na nowe programy zaczynasz, ale nie wpłynie to na ładowanie bibliotek współdzielonych — w tym przypadku (chociaż nigdy nie korzystałem z DBD::Oracle) ładujesz plik Oracle .so
do już działającego programu, więc jest „za późno” na zmianę LD_LIBRARY_PATH
. Dynamiczny linker /lib/ld.so
(lub tak) jest uruchamiany przed perl
, więc do czasu skompilowania skryptu i BEGIN{}
działa, jest już skonfigurowany.
możesz spróbuj ponownie wykonać swój skrypt jako jego własnego następcę lub coś takiego*, ale krótki skrypt powłoki prawie na pewno będzie najprostszym rozwiązaniem:
#!/bin/sh
export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client64/lib
export ORACLE_SID=prod
exec /usr/local/bin/your-db-program "[email protected]"
*- to byłoby trochę szalone, ale TIMTOWTDI:
eval {
use DBD::Oracle foo bar baz; …
};
if ([email protected] =~ /install_driver\(Oracle\) failed/) {
$ENV{LD_LIBRARY_PATH} .= ':/usr/lib/oracle/10.2.0.3/client64/lib';
$ENV{ORACLE_SID} = 'prod';
warn "Restarting with LD_LIBRARY_PATH reset:\n\[email protected]\n";
exec { $0 } $0 => @ARGV;
}