什么是-CSDA只在shebang线上指定了什么?

时间:2011-03-18 14:11:33

标签: perl unicode shebang

我正在寻找某人权威地确认或更正我认为我对Perl脚本的shebang行上的-CSDA选项的了解。

有关-CSDA的文档,请参阅perldoc perlrun。简言之

  
      
  • S:STDINSTDOUTSTDERR假设为UTF-8
  •   
  • D:UTF-8是输入和输出流的默认PerlIO层
  •   
  • 答:@ARGV元素应该是以UTF-8
  • 编码的字符串   
  • 要使-CSDA生效,必须在命令行中指定perl -CSDA script.pl

  • 在5.10之前,shebang行上的-CSDA将无声地失败,因为标准流已经被打开,并且@ARGV已经在遇到它时被填充,除非{{1}已经在命令行中指定了。

  • 在5.10之后,仅出现在shebang行的-CSDA会导致-CSDA因为该问题而嘎嘎作响。

  • 过去使用perl之前用于-CSDA的脚本应该从shebang行删除perl,因为它从未使用这些选项调用命令行(以及选项,如果仅在shebang行中指定,则不执行任何操作)。

我希望得到一些关于我上述哪些假设错误的可靠反馈。

2 个答案:

答案 0 :(得分:3)

不确定我是多么权威,但我知道这是如何运作的。

  • 你的第一个假设几乎是准确的。要使SDA选项产生任何效果,它们必须在启动解释器时存在。这可能是由于命令行上的-CSDA,或者可能是由于PERL_UNICODE环境变量,或者可能是我不知道的其他方法。
  • 你的第二个假设是正确的,至少是5.8.8。请注意,D标志仍然会对脚本打开的流产生正常影响。
  • 你的第三个假设是正确的。但是,从5.10.1开始,如果通过PERL_UNICODE环境变量或其他一些机制启用了适当的标志,它就不会呱呱叫。
  • 你的第四个假设 not 一般都是正确的。我猜你是在直接调用脚本时引用的情况,而不是以脚本作为参数调用perl解释器。有两个一般情况。
    • 在操作系统确定任何扩展名为“.pl”的文件将传递给perl解释器执行的系统(如Windows)上,您可能是正确的。但有人可能会认为,在没有-CSDA的情况下调用脚本时,这是一种理想的行为,而不是神秘失败的事情,因为标准输入和@ARGV不像脚本所期望的那样是UTF-8。
    • 在直接执行脚本时读取shebang行的系统,就像大多数* nix shell一样,在调用解释器时将使用shebang行中指定的命令行选项,因此在shebang行上使用-CSDA < em>将荣幸。

答案 1 :(得分:3)

如果您的脚本是

#!/usr/bin/perl -CSDA

然后使用

启动脚本
./script foo

操作系统将按如下方式启动Perl:

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

如果错误地启动脚本,行为的改变才会起作用,例如使用

/usr/bin/perl ./script foo

修复不是删除-CSDA,修复是正确调用脚本。