2017-04-18 2 views
0

% ENV 해시에 정의 된 변수에 액세스 할 때 Perl이 내게 undef 값을 제공합니다. 이것이 어떻게 가능한지?일부 항목이 Perl ENV 해시에 누락 된 이유

[email protected]:~/bin$ perl -e 'warn $ENV{SHELL}' 
Warning: something's wrong at -e line 1. 

I 출력 /빈/bash는 대신에게로 펄을 기대. 환경에

더 많은 정보는 :

[email protected]:~/bin$ echo $SHELL 
/bin/bash 

[email protected]:~/bin$ $SHELL --version 
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu) 
Copyright (C) 2011 Free Software Foundation, Inc. 
... 

[email protected]:~/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) 
... 

나는 고정 표시기 컨테이너에 씩씩 거리는 데비안에서이 작업을 실행하고 있습니다.

이 이미지는 제가 소스에서 직접 컴파일 펄-5.24.1와 같은 beheviour를 얻을 수

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

로 만들었습니다.

+2

@Jens : 가져 오지 않고 저의 작품 (Perl 5.18.2). – Thilo

+1

가져 오기없이 v5.10.0에서 작동 – 123

+1

'perl -E'에서 얻은 결과는 % ENV '키에 대해 말하는가? –

답변

1

오류 메시지

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

는 환경 변수 $ SHELL이 존재하지 않음을 나타냅니다 또는 를 내보낼 수 없습니다.

export 명령을 사용하여 내 보낸 변수를 나열 할 수 있습니다. 다음 명령을 사용하여 내 보낸 변수에 SHELL을 추가 할 수 있습니다.

export SHELL 
1

설치에 문제가 발생했습니다. (warn의 인수가 정의되지 않은 경우, 즉)는

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

은 오직 pp_sys.c 라인 (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 } 
관련 문제