2011-03-18 3 views
6

Perl 스크립트의 shebang 행에서 -CSDA 옵션에 대해 내가 아는 생각을 정식으로 확인하거나 수정할 사람을 찾고 있습니다.Shebang 라인에서만 지정된 -CSDA가 무엇입니까?

-CSDA에 대한 설명은 perldoc perlrun을 참조하십시오. 간단히

  • S : 입력 및 출력 둘 다에 대한 기본은 PerlIO 층
  • 스트림 UTF-8이된다 : STDIN, STDOUTSTDERR은 UTF-8
  • D가있는 것으로 가정된다 @ARGV을 요소는 문자열로 인코딩 될 예정이다 UTF-8
  • -CSDA이 효과를 가지려면 perl -CSDA script.pl과 같이 명령 줄에 지정해야합니다.

  • 이전에 표준 스트림이 이미 열려 및 @ARGV 이미 -CSDA 이미뿐만 아니라 명령 줄에 지정하지 않는 한이 검출 된 시간에 의해 채워 것 때문에 자동으로 실패 할 것 오두막 라인에 5.10, -CSDA합니다.

  • 5.10 이후에 shebang 줄에만 나타나는 -CSDA은 해당 문제로 인해 perl이 울리도록합니다.

  • 와 함께 작동하는 데 사용 -CSDA와 스크립트 perl의 사전 5.10이 명령 줄에서 해당 옵션 (그리고 옵션으로 호출되지 않았기 때문에에만 지정된 경우 -CSDA가의 오두막 라인에서 제거해야한다 shebang 선, 아무것도하지 않았다).

위의 내 가정 중 어떤 것이 틀린지에 대한 확실한 의견을 듣고 싶습니다.

답변

3

나는 권위있는 방법이 확실하지 않지만 이것이 어떻게 작동하는지 알고 있습니다.

  • 첫 번째 가정은 거의 정확합니다. SDA 옵션이 효과가 있으려면 통역사가 시작될 때 제공되어야합니다. 이는 커맨드 라인에서 -CSDA로 인한 것일 수도 있고 PERL_UNICODE 환경 변수 때문일 수도 있고 아니면 내가 모르고있는 다른 방법 일 수도 있습니다.
  • 귀하의 두 번째 가정은 적어도 5.8.8에 대해 정확합니다. D 플래그는 여전히 스크립트에 의해 열린 스트림에 대한 정상적인 효과를 가졌음을 유의하십시오.
  • 세 번째 가정은 정확합니다. 그러나 5.10.1부터는 PERL_UNICODE 환경 변수 나 다른 메커니즘을 통해 적절한 플래그가 활성화되어 있으면 작동하지 않습니다.
  • 네 번째 가정은 이 아니며 일반적으로이 아닙니다. 필자는 스크립트를 인수로 사용하여 perl 인터프리터를 호출하는 대신 스크립트가 직접 호출 될 때 상황을 언급하고 있다고 생각합니다. 두 가지 일반적인 경우가 있습니다.
    • 확장명이 ".pl"인 파일이 Windows와 같은 실행을 위해 perl 인터프리터에 전달되는 것으로 운영 체제에서 확인한 시스템에서 정확할 수 있습니다.그러나 표준 입력과 @ARGV가 스크립트가 예상하는 것처럼 UTF-8이 아니기 때문에, -CSDA없이 호출 될 때 스크립트가 이상한 행동을하는 대신 바람직한 행동이라고 주장 할 수 있습니다.
    • 대다수 * nix 셸처럼 스크립트가 직접 실행될 때 shebang 행을 읽는 시스템에서는 shebang 행에 지정된 명령 행 옵션이 해석기를 호출 할 때 사용되며 따라서 shebang 행의 -CSDA는 을 수락합니다.
+1

+1. 마지막 항목은'/ usr/bin/perl'이 인터프리터가 아니지만 호출 할'perl'의 버전을 결정하는 프로그램입니다 (예를 들어, OS X 시스템에서'5.8'과'5.10' 공존하는 경우), shebang 행의'-CSDA'는 결국'perl'이 호출 될 때 당황합니다. –

+0

이것이 사실이라면 래퍼 스크립트의 버그 일 것입니다. 그러나 Mac에서 확인한 결과 문제가 실제로 5.10.0 (OS X 10.6.6과 함께 제공됨)에서 -C가 항상 허용되지 않는 반면, 5.10.1 (Linux 컴퓨터에서 사용하는 것임) 지정된 플래그가 이미 활성화되어 있으면 허용됩니다. shebang에서 perl5.8.9를 지정하면 올바르게 -CSDA가 적용됩니다. – Anomie

+0

설명해 주셔서 감사합니다. 매우 감사. –

3

스크립트는

#!/usr/bin/perl -CSDA 

하고 다음과 같이 펄이 시작됩니다

./script foo 

OS를 사용하여 스크립트를 시작하는 경우 :

/usr/bin/perl -CSDA ./script foo 

변화를 ...에서 이러한 수정은 -CSDA를 제거되지

/usr/bin/perl ./script foo 

를 사용하여 같은 잘못 스크립트를 실행하는 경우의 행동은 활동하기 시작, 수정 올바르게 스크립트를 호출하는 것입니다.

+0

에 따라 다릅니다. 저는'-CSDA'가 내가 이해하려고하는이 프로그램의 기능에 어떤 영향을 주는지 알아 내려고합니다. –

+0

@Sinan Ünür, STDOUT 또는 STDERR로 인쇄 하시겠습니까? STDIN에서 읽습니까? 그런 다음 ASCII 범위를 벗어나는 것을 처리 할 것으로 예상된다면이를 사용하거나 비슷한 것을 사용해야합니다. – ikegami

+0

그래, 음, 잘 모르겠지만 그게 문제의 일부 야. –