しらいです。
In Message-Id <20060107130520.GA1332@xxxxxxxxxxxxxxxxxxxx>
SUZUKI Yasuhiro <yasu@xxxxxxxxxxx>さんwrites:
> こんばんは、鈴木@埼玉県(在住)です。
> '#! 〜〜'が第1行目のファイルは、execve()システム
> コールで処理され実行が成功するようになって
> いますので、シェルにシェルスクリプトと認識される
> 段階には至らず、シェルが '#! 〜〜'を処理することは
> ないようですね。
少なくとも私の知る限り、exec() の試行より先に自前で「#!」
を評価してしまうような shell の実装はありません。
普通は exec() の実行が ENOEXEC で失敗した時に初めて shell
側で「#!」を評価します。ENOEXEC 以外で失敗した時にも「#!」は
見ません。
そうしないと、全ての外部コマンドの実行に先立ってそのファイ
ルの一部を読込む必要がありますので、exec() に成功するであろ
う殆んどのコマンドに於いて overhead が大きくなります。
また、ひょっとすると OS によっては実行ファイルの先頭がたま
たま「#!」で始まらないとも限らないので、OS 依存性のないコー
ドを実装する意味でも先に「#!」を評価したりはしないでしょう。
因みに先の試行に先立って、勿論 shell の command line から
直接実行するという確認もしてますが、どの環境でも同様の結果が
得られてます。
> ところで、スクリプトが、 errno に ELIBBAD をセット
> して -1 を返して終了すると、スクリプトはファイルが
> 実行可能状態でなかったと認識し、スクリプトファイル
> として処理するステップに進むのでしょうか?
exec() に成功した場合はその process は二度と元の shell に
戻って来ませんから、「-1 を返す」こと自体が不可能です。
一般に exec() で起動されたコマンドの終了ステータスは、その
exec() を実行した process ではなく、その親 process が wait()
によって取得します。なので errno は参照不能です。
一方 exec() に失敗した場合は、終了ステータスではなくてその
exec() そのものの返り値として -1 が返って来るので、exec() を
実行した process がその後の処理を引継ぎます。
なので exec() に失敗したかのように shell script 側で偽装す
ることは不可能ですね。勿論、shell script でなくてもそういう
偽装コマンドを作成することは出来ません。
因みに終了ステータスの定義域は 0〜255 なので -1 という終了
ステータスはあり得ません。exit(-1) として終了させたとしても、
多分親 process には 255 が渡されると思います。
そういった意味でも shell script が exec() の失敗を偽装する
ことは出来ませんね。
> > 出沢さんが[linux-users:106095] で、'#! 〜'の処理は
> > シェルからカーネルに移ったというような発言をされて
> > いますが、
「移った」と言うよりは、kernel がその仕事をするようになっ
たので、shell に実装された「#!」処理コードが実際に使われるシ
ーンが無くなったということですね。
bash なんかは configure 時に exec() が「#!」を処理出来るか
否かを見ているので、exec() で処理出来る場合は「#!」処理コー
ドを実装しないようになってますけど。
> > # execve()で、スクリプトファイルを直接実行
> > # 可能であるとは知りませんでしたが。
んー、これって相当昔の話ですよ。面倒なので追ってないですけ
ど、Linux や PC UNIX が現れるずっと前から kernel で処理出来
るようになってた筈です。80 年代の中頃?
勿論、UNIX の系譜って複雑なので、最近まで「#!」を処理出来
ない kernel も一部には残っているとは思いますが、kernel のお
仕事という実装が一般的になってから 15 年は経ってる筈。
多分、発端が shell のお仕事だったために、思い込みでそう信
じ込んでる人が多いだけじゃないでしょうかね?
# と言うか shell のお仕事だった時代を知ってるのは相当なジ
#ジイかも :-)
Follow-Ups:
- [linux-users:106111] Re: #!で始まるスクリプトSUZUKI Yasuhiro
- [linux-users:106108] Re: #!で始まるスクリプトSUZUKI Yasuhiro
- Prev by Subject: [linux-users:106108] Re: #!で始まるスクリプト
- Next by Subject: [linux-users:106110] Re: #!で始まるスクリプト
- Previous by thread: [linux-users:106108] Re: #!で始まるスクリプト
- Next by thread: [linux-users:106111] Re: #!で始まるスクリプト
- Indexes:[Main][Thread]