[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[linux-users:106094] Re: #!で始まるスクリプト


 しらいです。

In Message-Id <43BCDFE2.5060408@xxxxxxx>
        Shigeru Makino <mac@xxxxxxx>さんwrites:
> 牧野です。

> >Linuxのようにshebankの複数の引数を、まとめてひとつとしてしまうもの。
> >古いFreeBSDのように引数をわけてくれるもの。
> >Solaris8のように最初の引数だけ渡してくれるもの。

 そもそも「#!」の展開は、昔は system call ではなくて shell
のお仕事でした。
 なので、例えば Linux の標準 shell である bash でも、内部で
「#!」を処理するコードが実装されてますね。因みにこの実装では
最初の引数一個のみ評価します。

 4.3BSD-Reno の辺りまで遡ると、この script 評価の実装はもっ
と単純になって、最初の 1byte が「#」なら C shell script でそ
うでなければ Bourne shell script という仕様でした。
 元々はこれは C shell の仕様だったものを、後になって Bourne
shell が C shell script 救済用にサポートしたというのがことの
顛末のようです。
 これを「#!」という現在の形に拡張したのは Korn shell らしく
って、その仕様が便利だってんで system call に実装されたのが
SYSV の時だそうな。この辺りは source 追えないので詳細不明。
 Korn shell の仕様を踏襲した Almquist shell の実装では、既
に「#!」に続く文字列が実行ファイルのパスになってるので、Korn
shell の時点でそういう仕様だったんだと思います。
 因みに当時の Almquist shell の実装では引数は最後まで全部展
開して別引数として評価してますね。


> POSIXの仕様は、Linux同様でしょうか?

 POSIX では引数のことまで定義されてません。と言うか、書いて
あるのをそのまま真に受けるならば、「#!」の直後から行末までが
全部コマンド名ってことになります。
 尤も、POSIX では「こういう exec() の実装もあり」という程度
のおまけ的な言及に留まってるので、別に厳格なもんではないと思
います。なんで「#!」非対応 exec() も POSIX 準拠でしょう。


> 新しいFreeBSDは、一纏めに変更になっているのでしょうか?

 「新しい」と言っても極最近の話のようですね。昨年の頭から旧
来実装に関する議論が勃発して、年末に正式リリースとなった新版
で採用された新仕様なんで。
 コマンド名以降は行末まで全部が単一の引数になっていますが、
行末の空白文字は取除かれるみたいです。経緯の詳細は以下の URL
から始まる thread を参照して下さい。
http://lists.freebsd.org/pipermail/freebsd-arch/2005-February/003525.html


> Solaris8の仕様は手の打ちようがありませんね。
> もっとも、
> #! /usr/local/bin/gawk -f
> とexeを使わずフルパスで書いても動かないのだから、
> もともとawk scriptを書けない仕様と言うことになりますね。

 最初の一個の引数は有効でしょう。二個目以降が無視されるだけ
のことで。
 そもそもコマンドに渡される引数はそのコマンドを呼出した時の
引数がそのまま渡される筈で、script 先頭行に記述された引数が
その直前に挿入されるというのは特例措置だと見なすべきです。
 ここに長々と引数を記述するような script は考え方が何か間違
っているんじゃないかと思いますよ。「#!」の後ろは「/bin/sh」
しか書かない、くらいの潔さがあってもいいかも。

 因みに「#!」の後ろの空白文字を無視出来ない実装もあるので、
移植性を考えるなら「#!」の直後にパス名を記述する癖をつけた方
がいいかも。大昔の実装だとそういう仕様が多いです。


> 簡単なプログラムなのに、exeの同類のプログラムによるアプローチがなかった
> ことに、
> 自分の見落とした弱点があるのではないかと実は躊躇しています。

 PATH を見て挙動を変える script なんて危なっかしくて私は使
いたくないですね。PATH に何が設定されているかを常に把握し切
れないと security hole に繋がり兼ねませんよ。
 PATH は login shell の run com file で設定している場合が多
いんでしょうけど、cron とか rsh とか run com file を参照しな
いケースで期待通りの挙動を示さないかも知れません。
 確かに便利は便利かも知れませんけど、便利さばかりを追求する
ようなら UNIX は似合わないかも。あ、Linux は UNIX じゃないっ
てんなら話はそれまでですが。

                                               しらい たかし

この情報があなたの探していたものかどうか選択してください。
yes/まさにこれだ!   no/違うなぁ   part/一部見つかった   try/これで試してみる

あなたが探していた情報はどのようなことか、ご自由に記入下さい。特に「まさにこれだ!」と言う場合は記入をお願いします。
例:「複数のマシンからCATV経由でipmasqueradeを利用してWebを参照したい場合の設定について」
Follow-Ups: References: