web-dev-qa-db-ja.com

PerlスクリプトのShebangラインには何を使用すればよいですか?

これらのうち、PerlスクリプトのShebangラインとして使用する方が良いまたは速いのはどれですか?

#! Perl

#! Perl.exe

#! fullpath/Perl(/Perl.exe)

#! partialpath/Perl(/Perl.exe)

そして、#!Perl、特定のシステムで動作する場合、使用しているPerlインタープリターをスクリプト内でどのようにして見つけることができますか。


そして、/path/path/Perl、は*または...フォルダーの使用を許可しますか?

44
Anonymous

#!をハードコーディングする必要がある場合は、_#!/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をアップグレードすることに決めた場合、シンボリックリンクを変更することでプロジェクトごとにアップグレードできます。

62
Schwern

Windowsシェバン(Perl.exe bit)(あなたの(ahem) "Shell"はおそらくそれを解析さえしないので、関係ないようです(私が間違っていれば直してください、最近変更されたかもしれません)。

ただし、一部のコマンドラインフラグは、Perl自体によって引き続き取得される場合があります( このスレッドによる )。

8
ChristopheD
  1. ChristopheDが指摘したように、私は練習(XPではActivePerl)から、ShebangラインはWindowsでは本当に必要ないことを確認できます。

    Shebang行は、Unixシェルにスクリプトを渡すインタープリターを指示します。

    Windowsでは、スクリプトを渡すプログラムは、拡張子に基づいた関連付けによって決定されます。

  2. Unixでは、3番目のオプション(Perl実行可能ファイルへのフルパス)が最適です。

    そして、はい、理論上は ".."を使用できます(シェルは気にしません)が、実際には相対パスを使用するべきではありません。

6
DVK

Windows上でApache経由でCGIを実行している場合、Shebang ISUSED。Perlへのフルパスが必要です。

6
user2509628

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;
.
.
.

これはいくつかの優れた実践であるため、明らかに最速のソリューションです。

これがあなたのお役に立てば幸いです。

ありがとう。

2
miksiii

また、「#!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を使用するのかはわかりません。使用しないので。)

0
user181548