我正在尝试设置一个特定的LD_LIBRARY_PATH
来加载libpcap的修改版本而不是系统范围的。
如果我使用LD_LIBRARY_PATH=/blah ./script_name
运行整个脚本,这当然有效。我想让用户透明,所以我尝试设置$ENV{'LD_LIBRARY_PATH'}
。然而,这不会改变行为。我试图将它放在BEGIN
块中以使其在其他use
- s之前工作,但也没有运气。
我怀疑这是因为ld在运行脚本的任何部分之前加载所有配置/在进程开始时配置自身。有没有办法让它发挥作用?
我想避免愚蠢的事情:
if (check_parent()) { $ENV...=.... ; `$0` ; exit }
(或者已经建议的外包装 - 越少越好和随机包装,越好)
答案 0 :(得分:5)
你可以用
替换你脚本的顶部#!/bin/sh
LD_LIBRARY_PATH="/blah:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH
exec perl -x -S "$0" "$@" || exit 1
#!perl
# rest of your script
答案 1 :(得分:0)
在Perl脚本中设置LD_LIBRARY_PATH的原因是,在Perl运行时,动态加载程序已经读取了LD_LIBRARY_PATH并且没有重新读取它。因此,即使是BEGIN块也为时已晚 - 动态加载器已经读取了它所需的内容。