シバンのどのタイプのパスがより望ましいですか?


20

スクリプトでは、最初の行でインタープリターへのパスを指定する必要があります。
しかし、異なるサーバーのLinux、Unix、またはBSDでは、このパスは異なる場合があります。

より好ましいものは何ですか?

#!/usr/bin/env bash 

または

#!/bin/bash 

回答:


22

標準の場所にインストールされている特定のインタープリターのシステムインストールバージョンを使用する場合は、直接パスを使用します。ユーザーの最初に表示されるインタープリターのバージョンを使用する場合は$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のサイト


Rubyを調べ始めたばかりで、Rubyの慣習は移植性のために[code]#!/ usr / bin / env ruby​​ [/ code]で始まることがわかった。一部の人は、これにより、Rubyインタープリターにコマンドライン引数を提供するのが難しくなると指摘しました。たとえば、 '-w'はPerlにとっても問題です。
bgvaughan

@bgvaughan Perlの場合、今日ではなく、スクリプトの本文で#!/usr/bin/perl使用use strict; use warnings;してから使用することが伝統的です#!/usr/bin/perl -w。しかし-T、シバンにいる必要があります。
キーストンプソン

パスの最初の1つだけが必要な場合は、#!perlを使用しないのはなぜですか。
wheredidthatnamecome from

@wheredidthatnamecomefrom:それが機能しないため。#!ラインの扱いは使いません$PATH。インタープリターのパスを指定する必要があります。(少なくとも私のシステムでは、相対パスになり得ることに気付いたが、それはめったに役に立たない。)
キーストンプソン

6

ベストプラクティスは次のとおりです。

#!/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にないと言う
マーティン・ボナーはモニカサポート

1

参考までに、それはシーバン#!です、あなたが必要#です。この行を使用して、スクリプトを実行するインタープリターを特定します。

デフォルトでは、Ubuntuは/bin/shダッシュにリンクしています

ダッシュについてどれだけ知りたいか、およびシステムシェルまたはデーモンシェルにダッシュが使用される理由に応じて、以下を参照してください。

cyberciti.bizダッシュ

Ubuntuダッシュのマニュアルページ

Bashは、ほとんどのLinuxユーザーが使用するデフォルトのシェルであり、ダッシュとは異なる機能を備えています。bash用に作成されたスクリプトは、ダッシュで実行すると適切に実行される場合とされない場合があり、スクリプトが複雑になるほど、実行される可能性は低くなります。

perlやpythonなどのために書かれたスクリプトは、/bin/shまたはでは実行されません/bin/bash

したがって、スクリプトを作成するとき、シーバンで使用するインタープリターを特定します

使用するものの選択は、スクリプトの作成者によって行われ、1つは別のものよりも優れていません。それらはすべて、さまざまな機能、利点、および欠点を持っています。


allsoを参照してください/ bin / shが/ bin / bashではなく/ bin / dashを指しているのはなぜですか?
enzotib
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.