14

私は両方を見てきました:

#!/path/...
#! /path/...

何が正しいですか?それは問題ですか?歴史はありますか?

古いバージョンの Unix では、スペースを入れないようにする必要があると聞いたことがあります。しかし、それはただの噂だと聞いた。誰か確実に知っていますか?


編集:これを尋ねるのに適した場所は思いつきませんでした。私が知っている限りでは、スペースがプログラムを別の方法で動作させる可能性があるため、プログラミングに関連しています。ということでこちらに質問させていただきました。

4

2 に答える 2

19

また、一部の古い Unix ライクなシステムでは空白が許可されていなかったという漠然とした記憶もありますが、少しの調査ではそれがサポートされていません。

このウィキペディアの記事によると、この#!構文は 1980 年 1 月にバージョン 8 Unix で導入されました。デニス リッチーによるこの機能の最初の発表では、次のように述べられています。

実行中のファイルがマジック文字で始まる場合#!、行の残りの部分が実行されたファイルのインタープリターの名前であると理解されるように、システムが変更されました。以前は (実際には今も) シェルがこの仕事の多くを行っていました。テキスト ファイルの名前がコマンドとして入力されると、実行可能モードでテキスト ファイルに対して自動的に実行されます。設備をシステム化することで、以下のメリットが得られます。

[をちょきちょきと切る]

この素晴らしい機会を利用するには、

#! /bin/sh

シェルスクリプトの最初の行の左マージンに。後の空白!はOKです。完全なパス名を使用します (検索は行われません)。現時点では、行全体が 16 文字に制限されていますが、この制限は引き上げられる予定です。

後の Unix ライクなシステムでは#!構文はサポートされていたものの、 の後の空白は許可されていなかったと考えられますが!、最初の実装では空白が明示的に許可されていたことを考えると、それはありそうにありません。

leonbloy's answer は、さらにコンテキストを提供します。

アップデート :

#!Perl インタープリター自体は、カーネルによって認識されないシステム上でも、 で始まる行を認識します。詳細については、この Web ページを実行perldoc perlrunするか、参照してください。

#! 行が解析されているため、行は常にスイッチについて調べられます。したがって、 #! 行、またはさらに悪いことに、#! さえ認識しません。プログラムの先頭を見つけるために -x が使用されたとしても、Perl がどのように呼び出されたかに関係なく、一貫したスイッチ動作を得ることができます。

Perl は . の後の空白も許可します#!

(個人的には、#!空白なしで行を書くことを好みますが、どちらの方法でも機能します。)

そして、leonjoy の回答は、Sven Mascheck によるこの Web ページを指しています。深く。(comp.unix.shell に関する最近の議論のため、今これについて言及します。)

于 2012-04-17T19:38:24.960 に答える
10

通常、両方の方法で機能するようです。ここ を参照してください。今日では、スペースのないバージョンの方がはるかに一般的であり、私にとってははるかに魅力的です。

ところで、これは特に Perl に関連するものではありません (ただし、プログラミングに関連することは間違いありません)。

于 2012-04-17T19:35:44.603 に答える