我经常在命令行上编写单行代码,如下所示:
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一样调用”?
答案 0 :(得分:3)
你对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
。
答案 1 :(得分:0)
我在#!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 -...