LD_LIBRARY_PATH
biến môi trường phải được đặt trước chương trình của bạn bắt đầu - trước perl
chính nó đã được tải. Thay đổi nó trong BEGIN{}
sẽ ảnh hưởng đến các chương trình mới mà bạn bắt đầu, nhưng nó sẽ không ảnh hưởng đến việc tải thư viện được chia sẻ - trong trường hợp này (mặc dù tôi chưa bao giờ sử dụng DBD ::Oracle), bạn đang tải một .so
của Oracle vào chương trình đã chạy, vì vậy đã “quá muộn” để thay đổi LD_LIBRARY_PATH
. Trình liên kết động /lib/ld.so
(hoặc lâu hơn) được bắt đầu trước perl
, do đó, vào thời điểm tập lệnh của bạn được biên dịch và BEGIN{}
đang chạy, nó đã được thiết lập.
Bạn có thể cố gắng thực thi lại tập lệnh của bạn dưới dạng kế thừa của chính nó hoặc thứ gì đó *, nhưng một tập lệnh shell ngắn gần như chắc chắn sẽ là giải pháp đơn giản nhất:
#!/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]"
* - điều này hơi điên rồ, nhưng 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;
}