ExtUtils::MakeMaker PERL_MM_OPT在空格上拆分解决方案
MakeMaker将PERL_-MM_-OPT拆分为空白,这意味着类似以下内容将无法工作ExtUtils::MakeMaker PERL_MM_OPT在空格上拆分解决方案,perl,Perl,MakeMaker将PERL_-MM_-OPT拆分为空白,这意味着类似以下内容将无法工作 export PERL_MM_OPT='LIBS="-L/usr/sfw/lib -lssl -lcrypto" INC=/usr/sfw/include' 是否有一个已知的解决方法,或者在这个场景中我必须避免使用PERL_-MM_-OPT --更新-- Moblule提出了使用制表符而不是空格的极好建议。mobrule只在空格上拆分是正确的。但是,该解决方案不起作用,因为它看起来像是将选项卡转换为环境变
export PERL_MM_OPT='LIBS="-L/usr/sfw/lib -lssl -lcrypto" INC=/usr/sfw/include'
是否有一个已知的解决方法,或者在这个场景中我必须避免使用PERL_-MM_-OPT
--更新--
Moblule提出了使用制表符而不是空格的极好建议。mobrule只在空格上拆分是正确的。但是,该解决方案不起作用,因为它看起来像是将选项卡转换为环境变量中的空格
> cat tmp.sh
export PERL_MM_OPT='LIBS="-L/usr/sfw/lib -lssl -lcrypto" INC=-I/usr/sfw/include'
echo $PERL_MM_OPT | perl -pe 's/\t/[t]/g' | perl -pe 's/ /[s]/g'
> head -1 tmp.sh | perl -pe 's/\t/[t]/g' | perl -pe 's/ /[s]/g'
export[s]PERL_MM_OPT='LIBS="-L/usr/sfw/lib[t]-lssl[t]-lcrypto"[s]INC=-I/usr/sfw/include'
> bash tmp.sh
LIBS="-L/usr/sfw/lib[s]-lssl[s]-lcrypto"[s]INC=-I/usr/sfw/include
--更新2--
因此,tab建议起了作用(我被echo的行为误导了,并得出了错误的结论,解释了它失败的原因),但它并没有解决问题
现在的问题是ExtUtils/Liblist/Kid.pm不需要一个前导的双引号(同样的结果也发生在单引号中)
因此,这个问题的解决方案(如果存在的话)似乎不能依赖于引号。实际上,
MakeMaker.pm
在空格上拆分,而不是在所有空格上拆分。你能用标签吗
export PERL_MM_OPT='LIBS=“-L/usr/sfw/libTab lsslTab lcrypto”INC=/usr/sfw/include
我认为您使用选项卡设置环境变量的方式是可以的——正是
echo
命令将选项卡转换为空格:
$ VAR='abc^Idef'
$ echo $VAR | od -c
0000000 a b c d e f \n
0000010
看起来好像没用。但是等等:
$ export VAR
$ perl -e 'print $ENV{VAR}' | od -c
0000000 a b c \t d e f
0000007
根据$ENV{PERL_MM_OPT}
中的参数如何传递到子流程(通过系统
,执行
,打开
等),这在ExtUtils::MakeMaker
中可能仍然有效,也可能无效:
系统调用1将起作用,因为当system
调用有一个带有任何元字符的arg时,它会将命令传递给shell。shell将正确解析参数
系统调用2失败,因为multi-arg
system
总是绕过shell,并且gcc
一直在寻找一个名称不太可能是“libssl^I-lcrypto^I-L/usf/sfw/lib.a”的库。如果ExtUtils::MakeMaker
正在使用此调用样式来运行编译器,那么此解决方案将无法完成此任务。实际上,MakeMaker.pm
在空格上拆分,但不在所有空格上拆分。你能用标签吗
export PERL_MM_OPT='LIBS=“-L/usr/sfw/libTab lsslTab lcrypto”INC=/usr/sfw/include
我认为您使用选项卡设置环境变量的方式是可以的——正是
echo
命令将选项卡转换为空格:
$ VAR='abc^Idef'
$ echo $VAR | od -c
0000000 a b c d e f \n
0000010
看起来好像没用。但是等等:
$ export VAR
$ perl -e 'print $ENV{VAR}' | od -c
0000000 a b c \t d e f
0000007
根据$ENV{PERL_MM_OPT}
中的参数如何传递到子流程(通过系统
,执行
,打开
等),这在ExtUtils::MakeMaker
中可能仍然有效,也可能无效:
系统调用1将起作用,因为当system
调用有一个带有任何元字符的arg时,它会将命令传递给shell。shell将正确解析参数
系统调用2失败,因为multi-arg
system
总是绕过shell,并且gcc
一直在寻找一个名称不太可能是“libssl^I-lcrypto^I-L/usf/sfw/lib.a”的库。如果ExtUtils::MakeMaker
正在使用此调用样式来运行编译器,那么此解决方案将无法完成此任务。Bummer。现在这已经成为一个bash/shell问题。我希望这个问题的唯一解决方案是在EU::MM中添加更好的ARGV处理。我只晚了一年,但是因为它是在空格上而不是在制表符上拆分的,你能省去双引号吗?糟糕。现在,这已经成为一个bash/shell问题。我希望这个问题的唯一解决方案是在EU::MM中添加更好的ARGV处理。我只晚了一年,但由于它是在空格上而不是在制表符上拆分的,您能省去双引号吗?>是echo命令将制表符转换为空格。您是对的。tab建议确实有效,我对它失败的原因得出了错误的结论。现在的问题是ExtUtils/Liblist/Kid.pm不需要一个前导引号。忽略了LIBS中无法识别的参数:“-L/usr/sfw/lib”因此,似乎这个问题的解决方案(如果存在的话)不能依赖引号或空格。>是echo命令将制表符转换为空格。你是对的。制表符建议确实有效,我得出了错误的结论,解释了失败的原因。现在的问题是ExtUtils/Liblist/Kid.pm不需要前导引号。LIBS中未识别的参数被忽略:“-L/usr/sfw/lib”所以,似乎这个问题的解决方案(如果有的话)不能依赖于引号或空格。