为什么Perl ENV哈希中缺少某些条目

时间:2017-04-18 10:18:07

标签: perl shell docker environment

当我访问应该在%ENV 哈希中定义的变量时,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 wheezy上运行它。

图像是用

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

我从perl-5.24.1手动编译来源,获得了相同的行为。

2 个答案:

答案 0 :(得分:1)

错误消息

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

表示环境变量$ SHELL不存在或未导出

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

export SHELL

答案 1 :(得分:1)

您的安装出了问题。它看起来像字符串

  

warn

只能由one like this one中第461行的以下代码生成(即,perl的参数未定义时)。因此,我将推断在调用root之前清理环境的事情。您可能还想检查.profile .bashrc.bash_profile 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 } 以及其他可能相关的配置文件。

{{1}}