しらいです。
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 じゃないっ
てんなら話はそれまでですが。
しらい たかし
Follow-Ups:
- [linux-users:106095] Re: #!で始まるスクリプトdezawa
- [linux-users:106096] Re: #!で始まるスクリプトHIROSE, Masaaki
- [linux-users:106104] Re: #!で始まるスクリプトKazuhiro NISHIYAMA
- [linux-users:106091] Re: #!で始まるスクリプトShigeru Makino
- Prev by Subject: [linux-users:106093] Re: #!で始まるスクリプト
- Next by Subject: [linux-users:106095] Re: #!で始まるスクリプト
- Previous by thread: [linux-users:106093] Re: #!で始まるスクリプト
- Next by thread: [linux-users:106095] Re: #!で始まるスクリプト
- Indexes:[Main][Thread]