首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-CSDA只在shebang线上指定有什么好处?

-CSDA只在shebang线上指定有什么好处?
EN

Stack Overflow用户
提问于 2011-03-18 14:11:33
回答 2查看 543关注 0票数 6

我正在寻找一个权威的人来确认或纠正我认为我知道的关于Perl脚本的shebang行中的-CSDA选项。

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

  • S:STDINSTDOUTSTDERR被假定在UTF-8中。
  • D: UTF-8是输入流和输出流的默认PerlIO层。
  • @ARGV元素应该是以UTF-8编码的字符串。
  • 要使-CSDA产生任何效果,必须在命令行中指定它,就像在perl -CSDA script.pl中那样。
  • 在5.10之前,shebang行上的-CSDA将悄然失败,因为当遇到标准流时,标准流已经打开,@ARGV已经填充,除非在命令行中已经指定了-CSDA
  • 在5.10之后,只出现在shebang行上的-CSDA会导致perl因为这个问题而嘎嘎作响。
  • 使用-CSDA的脚本用于使用perl的pre-5.10应该将-CSDA从shebang行中删除,因为它从未在命令行中使用这些选项被调用(如果仅在shebang行上指定这些选项,则什么也不做)。

我很想得到一些可靠的反馈,说明我以上的假设中哪些是错误的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-18 16:23:55

不知道我有多权威,但我知道这是怎么回事。

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

票数 3
EN

Stack Overflow用户

发布于 2011-03-18 18:26:57

如果你的脚本是

代码语言:javascript
复制
#!/usr/bin/perl -CSDA

然后开始使用

代码语言:javascript
复制
./script foo

操作系统将启动Perl,如下所示:

代码语言:javascript
复制
/usr/bin/perl -CSDA ./script foo

行为上的改变只有在错误启动脚本时才起作用,例如使用

代码语言:javascript
复制
/usr/bin/perl ./script foo

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5353194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档