2011-04-05 74 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,以及上面引用的其他內容)。