Linuxで `#!/ usr / bin / envコマンド--argument`を使用したシェバン行が失敗する


53

私は簡単なスクリプトを持っています:

#!/usr/bin/env ruby --verbose
# script.rb
puts "hi"

私のOSXボックスでは、うまく動きます:

osx% ./script.rb
hi

しかし、私のLinuxボックスでは、エラーがスローされます

linux% ./script.rb
/usr/bin/env: ruby --verbose: No such file or directory

シバンラインを手動で実行すると、正常に動作します

linux% /usr/bin/env ruby --verbose ./script.rb
hi

しかしruby --verbose、1つの引数にパックするとエラーを再現できますenv

linux% /usr/bin/env "ruby --verbose" ./script.rb
/usr/bin/env: ruby --verbose: No such file or directory

だから、これはenvシェバンラインのリセットをどのように解釈するかという問題だと思います。私はGNU coreutils 8.4を使用していますenv

linux% /usr/bin/env --version
env (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Richard Mlynarik and David MacKenzie.

これは本当に奇妙に思えます。これは、このバージョンの一般的な問題envですか、それとも、私が知らない他の何かがここで起こっていますか?



ここでcoreutils 8.17でも同じです。奇妙な。Fedoraへの報告。これは、マニュアルの記載に反しているためです。
フォンブランド

@vonbrand Fedoraは何と言いましたか?「私たちは気にしません。」

回答:


44

これは、Linux(BSDとは異なり)がshebangコマンド(この場合はenv)に1つの引数のみを渡すためです。

これはStackOverflowで詳細に説明されています。


3
また、このページ参照して、さまざまなUnicesでの動作を確認してください
ステファンシャゼル

4
指定は失敗します。我が神よ。
コンラッドルドルフ14

3
「仕様の失敗」によって、すべてのUnixシステムが複数の引数を受け入れる必要があることを意味する場合、私は100%あなたに同意します:)
アレクサンダーミルズ

GNUほど「Linux」ではありません。
意志

5

@rampionコメントでこれを見つけました:

起こるのは、カーネルがファイルの最初の2文字を処理して#!を探すことです。それらが見つかった場合、スペース以外の文字を探すためにすべてのスペース文字をスキップし、実際の実行可能ファイルであり、別のスクリプトではないインタープリターパスを抽出しますが、Linuxはそれを拡張して再帰的なスクリプト処理を可能にします。その後、最初のスペース以外の文字にスキップして、そこから次の改行文字に進み、それを単一の引数としてコマンドに渡します。引用符やその他のメタ文字の「シェル」処理はありません。それはすべて非常にシンプルで総当たりです。そのため、そこにあるオプションに夢中になることはできません。含まれている引数の空白は1つだけで、「perl -w」はカーネルがここで認識して渡すものです。

ソース:http : //lists.gnu.org/archive/html/bug-sh-utils/2002-04/msg00020.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.