55

これらのうち、Perl スクリプトのシバン行として使用するのに適している、または高速なのはどれですか?

#! perl

#! perl.exe

#! fullpath/perl(/perl.exe)

#! partialpath/perl(/perl.exe)

を使用する#!perl場合、特定のシステムで動作する場合、使用している perl インタープリターをスクリプトで見つけて、それをシバン行に入れるにはどうすればよいですか?


また、 を使用している場合/path/path/perl、フォルダに使用できる*か、許可されていますか?...

4

8 に答える 8

74

#! をハードコーディングする必要がある場合は、 を使用して#!/usr/bin/env perlください。なんで?あなたが望むのは、Perl プログラムがユーザーの好みの Perl で実行されることです。それは彼らの最初のオンになるでしょうPATH#!perl私が意味することはしません。ユーザーのPATHを検索しません#!/usr/bin/env perl。それをやってのける方法です。 /usr/bin/envUnix システムでは常に存在します。

他の人が指摘しているように、ユーザーが 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 をアップグレードする場合は、シンボリック リンクを変更することでプロジェクトごとにアップグレードできます。

于 2010-05-07T22:31:33.753 に答える
8

Windows で Apache 経由で CGI を実行している場合は、SHEBANG が使用されます。perl へのフルパスが必要です。

于 2014-05-19T14:36:43.963 に答える
8

あなたの(エヘム)「シェル」はおそらくそれを解析さえしないので、WindowsのShe-bang(perl.exeビットから推測)は無関係のようです(私が間違っている場合は修正してください。最近変更された可能性があります)。

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

于 2010-05-07T22:09:41.930 に答える
6
  1. ChristopheD が指摘したように、実際 (XP では ActivePerl) から、シバン行は Windows では実際には必要ないことが確認できます。

    シバン行は、スクリプトを渡すインタープリターを Unix シェルに伝えます。

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

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

    はい、理論上は ".." を使用できますが (シェルは気にしません)、実際には相対パスを使用しないでください。スクリプトを実行するときの現在の作業ディレクトリがどうなるかはわかりません。

于 2010-05-07T22:15:15.133 に答える
5

Perlを使用してUnixで開発していて、「perlbrew」を使用して異なるバージョンのPerlを簡単に切り替える場合は、「#!/ usr / bin/envperl」シバン行が適切に機能します。

私はもともとシバンラインの最初の2文字を逆にしました。それを修正/編集しました。

于 2012-08-18T03:29:28.540 に答える
4

最初の行はシバンを表します。Perl はインタプリタ言語であるため、基本的に Perl インタプリタが配置されている場所をプログラムに通知します。Linux では、ターミナルに次のように入力できます。

whereis perl

正確な位置がわかります。通常は/usr/bin/perl内にあります。これは、/usr/bin/perl に関してシバンを作成することを意味します。

#! /usr/bin/perl

use strict;
use warnings;
use v5.10.1;
.
.
.

これは良い習慣にすぎないため、明らかに最速のソリューションです。

これがお役に立てば幸いです。

ありがとう。

于 2015-02-22T14:51:06.837 に答える
1

また、「#! perl」を使用する場合、特定のシステムで動作する場合、Shebang Line に含めることができる perl.exe へのフル パスを表示するための print() は何ですか?

print ステートメントを使用している場合は、既に perl コードを実行しているので...

于 2010-05-07T22:19:00.683 に答える
0

これは、私が Perl で嫌いなことの 1 つです。

Windows では、少なくとも ActiveState Perl を使用している場合、ファイルが .pl で終わる場合、シバン行に関係なく、Windows レジストリが Perl インタープリターを実行します。Cygwin では、理由はわかりませんが#! perl動作します。Unix では、Perl 実行可能ファイルへのフル パスをシバン行に配置する必要があります。Schwern の使用のアイデアenvは便利ですが、コメントで指摘したように、いくつかの危険があります。

これが、Perl スクリプトを CPAN モジュールとしてパッケージ化することが最善の解決策であると提案する理由です。Module::Build のような CPAN インストーラーは、シェバン行を Perl インタープリターへのフルパスに変更します。(Schwern のインストーラー ExtUtils::MakeMaker がこれを行うのか、それとも を使用するのかはenv、私は使用しないのでわかりません。)

于 2010-05-08T02:13:35.900 に答える