2011-04-05 91 views
0

我经常写在命令行上的俏皮话像这样:perl:强制使用命令行标志?

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

为了scriptify这一点,我可以通过相同的标志的家当行:

#!/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'调用?

+2

Perl重新扫描#!不管它如何被调用。 – tchrist 2011-04-05 23:08:44

+0

是的,但是一旦你使用'chmod + x''d它就不会有太多的工作。 – tchrist 2011-04-05 23:16:09

回答

3

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

对于开关,#!行总是被检查,因为该行正被解析为 。因此,如果您所在的计算机只允许一个参数 与#!一行,或者更糟糕的是,甚至不会识别#!行,但无论Perl调用了多少个Perl ,您的 仍可以获得一致的切换行为,即使-x被用来找到程序的开始。

(...)

#!开关的解析开始无论perl在 线被提及。序列“ - *”和“ - ”是专门被忽略,这样你可以 ,如果你是这样的倾向,说

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

让Perl中看到-p开关。

现在,以上报价预计perl -x,但如果你用启动脚本它的作品一样好

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

(有足够的字符来让过去的32个字符的限制与该限制系统;详情请参阅perldoc perlrun,以及上面引用的其他内容)。