回答:
標準の場所にインストールされている特定のインタープリターのシステムインストールバージョンを使用する場合は、直接パスを使用します。ユーザーの最初に表示されるインタープリターのバージョンを使用する場合は$PATH、を使用します#!/usr/bin/env ...。
このenvコマンドは、指定されたコマンドを呼び出し、環境変数を設定または設定解除できます。
env FOO=BAR do-something
env DISPLAY=:0.0 xterm -ls &
環境変数やその他のオプションを指定しない場合、指定されたコマンドが呼び出されるだけです。(この方法で使用することは、ほぼ間違いなくハッキングです。)
シバンを次のように書く目的
#!/usr/bin/env interp
でinterp最初に現れるものを呼び出すこと$PATHです。
正確にスクリプトを書くときに、知っている必要はありません。この手段、interp(それがいずれかであることができれば、たとえばある/bin、/usr/binまたは/usr/local/bin)。もちろん、それがであることを知っている必要がありますenvが/usr/bin/env、それはかなり普遍的であるようです。
利点は、ユーザーのに最初に表示されるインタープリターのバージョンを呼び出すこと$PATHです。欠点は、それがユーザーの中で最初に表示されるインタプリタのいずれかのバージョンを呼び出すことです$PATH。
例えば、私は個人的なビルドをインストールしたと仮定しperlて、自分のホームディレクトリの下に$HOME/bin/perl、と私は$HOME/bin私の目の前で$PATH。シバンのスクリプトを実行すると
#!/usr/bin/env perl
その後、インストールされた自分のperl実行可能ファイルで実行されますが、これは良いことではないかもしれません。スクリプトの作成者は、1か月前にソースから構築した最先端のPerlでテストしていない可能性があります。
ほとんどのシステム(/usr/bin/perlおよび/bin/bashそれぞれ)の一貫した場所にインストールされる可能性が高いPerlやBashのようなものについては、コマンドへの直接パスを使用します。異なるシステムに異なる方法でインストールできるもっとわかりにくいものについては、/usr/bin/envトリックを使用するか、スクリプトのインストール時にシェバン行を調整するインストーラーを作成します。(以前はPerlスクリプトでそれをしなければなりませんでした。)
UPDATE:私はもう少し詳細に行ってきた、この答えにこの質問へのUnixの&Linuxのサイト。
#!/usr/bin/perl使用use strict; use warnings;してから使用することが伝統的です#!/usr/bin/perl -w。しかし-T、シバンにいる必要があります。
#!ラインの扱いは使いません$PATH。インタープリターのパスを指定する必要があります。(少なくとも私のシステムでは、相対パスになり得ることに気付いたが、それはめったに役に立たない。)
ベストプラクティスは次のとおりです。
#!/usr/bin/env bash
#!/usr/bin/env sh
#!/usr/bin/env python
等々...
Ubuntuが初めてダッシュを使用し始めたとき、いくつかのスクリプトが壊れました。それについて議論がありました。#!/bin/sh/ bin / bashへのリンクであるほとんどのスクリプトが作成されました。コンセンサスは次のとおりです。スクリプト作成者は、インタープリターを指定する責任があります。したがって、スクリプトを常にBASHで呼び出す必要がある場合は、環境から指定してください。これにより、さまざまなUnix / Linuxシステムで異なるパスを推測する必要がなくなります。さらに、明日/ bin / shが/ bin / wthshや他のnonsenceのような他のシェルへのリンクになっても機能します。
#!/bin/bashでした。私は、スクリプトライターがインタプリタを指定するための責任があることを同意するが、すべてのことな手段であるあなたがbashのが必要な場合は、bashがshにないと言う
参考までに、それはシーバン#!です、あなたが必要#です。この行を使用して、スクリプトを実行するインタープリターを特定します。
デフォルトでは、Ubuntuは/bin/shダッシュにリンクしています
ダッシュについてどれだけ知りたいか、およびシステムシェルまたはデーモンシェルにダッシュが使用される理由に応じて、以下を参照してください。
Bashは、ほとんどのLinuxユーザーが使用するデフォルトのシェルであり、ダッシュとは異なる機能を備えています。bash用に作成されたスクリプトは、ダッシュで実行すると適切に実行される場合とされない場合があり、スクリプトが複雑になるほど、実行される可能性は低くなります。
perlやpythonなどのために書かれたスクリプトは、/bin/shまたはでは実行されません/bin/bash。
したがって、スクリプトを作成するとき、シーバンで使用するインタープリターを特定します
使用するものの選択は、スクリプトの作成者によって行われ、1つは別のものよりも優れていません。それらはすべて、さまざまな機能、利点、および欠点を持っています。