これらのうち、PerlスクリプトのShebangラインとして使用する方が良いまたは速いのはどれですか?
#! Perl
#! Perl.exe
#! fullpath/Perl(/Perl.exe)
#! partialpath/Perl(/Perl.exe)
そして、#!Perl
、特定のシステムで動作する場合、使用しているPerlインタープリターをスクリプト内でどのようにして見つけることができますか。
そして、/path/path/Perl
、は*
または...
フォルダーの使用を許可しますか?
#!をハードコーディングする必要がある場合は、_#!/usr/bin/env Perl
_を使用します。どうして?必要なのは、Perlプログラムをユーザーの好みのPerlで実行することです。これは、PATH
で最初になります。 _#!Perl
_は、ユーザーのPATHを検索しません。つまり、_#!/usr/bin/env Perl
_は、それを実現する方法です。 _/usr/bin/env
_は常にUnixシステム上にあります。
ユーザーがWindowsを使用している場合、他の人が指摘しているように、それは問題ではありません。 Windowsは#を使用しません!ファイル拡張子の関連付けを使用します。プログラムが_foo.pl
_または何かと呼ばれ、動作することを確認してください。ただし、#!とにかくいくつかのユーティリティとエディタがそれを利用するので、行。
コードを出荷している場合は、インストーラーが処理します。 _MakeMaker/Makefile.PL
_と_Module::Build/Build.PL
_の両方が#を変更します!ユーザーがインストールに使用したPerlに一致する行。彼らはあなたのためにこの問題の世話をします。
独自の実稼働用のコードをインストールする場合は、Perlの特定のコピーへのフルパスを使用する必要があります。 perlのどのコピーですか?プロジェクト固有のもの。これは、プロジェクトごとにPerlをコンパイルする必要があるということですか?いいえ、シンボリックリンクを作成できます。プロジェクトfooには_/usr/local/bin/fooperl
_が_/usr/bin/Perl5.18
_を指す場合があります。 _#!/usr/local/bin/fooperl
_を使用します。 Perlをアップグレードすることに決めた場合、シンボリックリンクを変更することでプロジェクトごとにアップグレードできます。
Windowsシェバン(Perl.exe
bit)(あなたの(ahem) "Shell"はおそらくそれを解析さえしないので、関係ないようです(私が間違っていれば直してください、最近変更されたかもしれません)。
ただし、一部のコマンドラインフラグは、Perl自体によって引き続き取得される場合があります( このスレッドによる )。
ChristopheDが指摘したように、私は練習(XPではActivePerl)から、ShebangラインはWindowsでは本当に必要ないことを確認できます。
Shebang行は、Unixシェルにスクリプトを渡すインタープリターを指示します。
Windowsでは、スクリプトを渡すプログラムは、拡張子に基づいた関連付けによって決定されます。
Unixでは、3番目のオプション(Perl
実行可能ファイルへのフルパス)が最適です。
そして、はい、理論上は ".."を使用できます(シェルは気にしません)が、実際には相対パスを使用するべきではありません。
Windows上でApache経由でCGIを実行している場合、Shebang ISUSED。Perlへのフルパスが必要です。
UnixでPerlを使用して開発していて、「perlbrew」を使用してPerlの異なるバージョン間を簡単に切り替える場合、「!#/ usr/bin/env Perl」Shebang行が適切に機能します。
最初の行はシバンを表します。 Perlはインタープリター言語であるため、基本的にはプログラムにPerlインタープリターの場所を伝えます。 Linuxでは、ターミナルで入力できます。
whereis Perl
正確な場所がわかります。通常は/ usr/bin/Perlの中にあります。これは、/ usr/bin/Perlに関してShebangを作成することを意味します
#! /usr/bin/Perl
use strict;
use warnings;
use v5.10.1;
.
.
.
これはいくつかの優れた実践であるため、明らかに最速のソリューションです。
これがあなたのお役に立てば幸いです。
ありがとう。
また、「#!Perl」を使用する場合、特定のシステムで動作する場合、Perl.exeへのフルパスを表示するためのprint()は、Shebang Lineに含めることができますか?
さて、printステートメントを使用している場合は、すでにPerlコードを実行しているので...
これは Perlで嫌いなもの の1つです。
Windowsでは、少なくともActiveState Perlを使用している場合、ファイルの末尾が.plであれば、Shebang行に関係なく、WindowsレジストリはPerlインタープリターを実行します。 Cygwinでは、理由はわかりませんが、#! Perl
も機能します。 Unixでは、Shebang行にPerl実行可能ファイルへのフルパスを入力する必要があります。 env
を使用するというSchwernのアイデア は便利ですが、コメントで指摘したように、多少の危険があります。
これが、最善の解決策がPerlスクリプトをCPANモジュールとしてパッケージ化することであるとあなたに提案する理由です。 Module :: BuildなどのCPANインストーラーは、Shebang行をPerlインタープリターへのフルパスに変更します。 (SchwernのインストーラーExtUtils :: MakeMakerがこれを行うのか、env
を使用するのかはわかりません。使用しないので。)