为什么Perl ENV哈希中缺less一些条目

当我访问应该在%ENV散列中定义的variables时,Perl给了我一个undef值。 这怎么可能?

root@23cd5f45def7:~/bin$ perl -e 'warn $ENV{SHELL}' Warning: something's wrong at -e line 1. 

我希望perl输出/ bin / bash

更多关于环境的信息:

 root@23cd5f45def7:~/bin$ echo $SHELL /bin/bash root@23cd5f45def7:~/bin$ $SHELL --version GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. ... root@23cd5f45def7:~/bin$ perl -v This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi (with 91 registered patches, see perl -V for more detail) ... 

我在docker集装箱上运行这个Debian喘息。

该图像是用

 sudo debootstrap wheezy ../_build http://ftp.us.debian.org/debian sudo tar -C ../_build -c . | docker import - wheezy/bootstrap 

我从源代码手动编译perl-5.24.1得到相同的beheviour。

错误消息

 Warning: something's wrong at -e line 1. 

表示环境variables$ SHELL不存在或不被导出

您可以使用export命令列出导出的variables。 您可以使用以下命令将SHELL添加到导出的variables:

 export SHELL 

您的安装有问题。 它看起来像string

Warning: something's wrong at -e line 1.

只能由pp_sys.c中的第461行的下面的代码生成 (也就是说,当warn的参数未定义时)。 因此,我将推断在perl被调用之前,环境会消毒。 您可能还需要检查root.profile.bashrc.bash_profile和其他可能相关的configuration文件。

  421 PP(pp_warn) 422 { 423 dSP; dMARK; 424 SV *exsv; 425 STRLEN len; 426 if (SP - MARK > 1) { 427 dTARGET; 428 do_join(TARG, &PL_sv_no, MARK, SP); 429 exsv = TARG; 430 SP = MARK + 1; 431 } 432 else if (SP == MARK) { 433 exsv = &PL_sv_no; 434 EXTEND(SP, 1); 435 SP = MARK + 1; 436 } 437 else { 438 exsv = TOPs; 439 if (SvGMAGICAL(exsv)) exsv = sv_mortalcopy(exsv); 440 } 441 442 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) { 443 /* well-formed exception supplied */ 444 } 445 else { 446 SV * const errsv = ERRSV; 447 SvGETMAGIC(errsv); 448 if (SvROK(errsv)) { 449 if (SvGMAGICAL(errsv)) { 450 exsv = sv_newmortal(); 451 sv_setsv_nomg(exsv, errsv); 452 } 453 else exsv = errsv; 454 } 455 else if (SvPOKp(errsv) ? SvCUR(errsv) : SvNIOKp(errsv)) { 456 exsv = sv_newmortal(); 457 sv_setsv_nomg(exsv, errsv); 458 sv_catpvs(exsv, "\t...caught"); 459 } 460 else { 461 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP); ## <-- Here ... 462 } 463 } 464 if (SvROK(exsv) && !PL_warnhook) 465 Perl_warn(aTHX_ "%" SVf, SVfARG(exsv)); 466 else warn_sv(exsv); 467 RETSETYES; 468 }