【问题标题】:perl: force the use of command line flags?perl:强制使用命令行标志?
【发布时间】:2011-07-30 09:21:50
【问题描述】:

我经常在命令行上这样写单行代码:

perl -Magic -wlnaF'\t' -i.orig -e 'abracadabra($_) for (@F)' 

为了编写脚本,我可以将相同的标志传递给 shebang 行:

#!/usr/bin/perl -Magic -wlnaF'\t' -i.orig
abracadabra($_) for (@F);

但是,这样做有两个问题。首先,如果有人通过将脚本直接传递给 perl 来调用脚本(作为 'perl script.pl',而不是 './script.pl'),则忽略标志。此外,我不能为此使用“/usr/bin/env perl”,因为显然我不能在使用 env 调用 perl 时将参数传递给它,所以我不能使用不同的 perl 安装。

有没有办法告诉脚本“嘿,总是像使用 -wlnaF'\t' -i.orig 调用你一样运行”?

【问题讨论】:

  • Perl 重新扫描 #!行,不管它是如何被调用的。
  • 是的,但是一旦你 chmod +x'd 它就不会有太大作用了。

标签: perl


【解决方案1】:

您对perl script.pl 版本的看法不正确; Perl 专门从 #! 行中查找和解析选项,即使在非 Unix 上并且如果作为脚本而不是直接运行。

#! 行始终检查开关,因为该行正在 解析。因此,如果你在一台只允许一个参数的机器上 使用#! 行,或者更糟的是,甚至无法识别#! 行,你 不管 Perl 是怎样的,仍然可以获得一致的开关行为 调用,即使 -x 用于查找程序的开头。

(...)

#! 开关的解析开始于 perl 中提到的任何地方 线。序列“-*”和“-”被特别忽略,以便您 如果你愿意的话,可以说

#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
    if 0;

让 Perl 看到 -p 开关。

现在,上面的引用需要perl -x,但如果你用它启动脚本,它也同样有效

#! /usr/bin/env perl                                                   -*-perl -p-*-

(在具有该限制的系统上,有足够的字符超过 32 个字符的限制;请参阅perldoc perlrun 了解有关此内容以及我上面引用的其余内容的详细信息)。

【讨论】:

    【解决方案2】:

    #!env perl -... 我也遇到了同样的问题,env 最终帮了大忙:

    $ env 'perl -w'
    env: ‘perl -w’: No such file or directory
    env: use -[v]S to pass options in shebang lines
    

    所以,只需将shebang修改为#!/usr/bin/env -S perl -...

    【讨论】:

      猜你喜欢
      • 2020-09-21
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2013-09-30
      相关资源
      最近更新 更多