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

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


こんばんは。鈴木@埼玉県(在住)です。

しらいさんが試したのは、
On Sat, Jan 07, 2006 at 06:35:47PM +0900, Takashi SHIRAI wrote:
   ...(略)...
>  shell が自身で「#!」を評価してしまうのを防ぐために、敢えて
> execve() を使ってますが、...(略)...
ですので、execve()システムコールでも、'#! 〜〜'で始まる
スクリプトファイルを実行させることができる、という
ことですね。

出沢さんが[linux-users:106095] で、'#! 〜'の処理は
シェルからカーネルに移ったというような発言をされて
いますが、
# しらいさんの[linux-users:106094] でもそういう
# 印象を受けます。
スクリプトファイルをコマンドラインなどで
実行する際に、まず初めに処理するのは、
相変わらずシェルではないでしょうか?
# execve()で、スクリプトファイルを直接実行
# 可能であるとは知りませんでしたが。

bashのMANページは、
  プログラムが #! で始まるファイルである場合、
  最初の行の残りの部分はこのプログラムの
  インタプリタを指定します。シェルは指定された
  インタプリタをオペレーティングシステム上で
  実行します。オペレーティングシステムは、
  この実行可能フォーマットを直接処理しません。
  インタプリタに対する引き数は、プログラムの
  先頭の行のインタプリタ名の後の省略可能な引き
  数 1 つと、その後のプログラム名、さらに
   (もしあれば) その後のコマンドへの引き数から
  構成されます。
としています。
(参考)
   http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html

また execve()システムコールでは、
   "#! interpreter [arg]" という形式の行で始まる
  スクリプトでなければならない。後者の場合、
  interpreter は適切な実行ファイルのパス名で
  なければならず、それ自身がスクリプトであっては
  ならない。そしてそれは interpreter [arg] filename の
  形で呼び出される。
だそうです。
(参考)
   http://www.linux.or.jp/JM/html/LDP_man-pages/man2/execve.2.html

以上です。

------------------------------------------------------------
鈴木 康弘(SUZUKI Yasuhiro)
  yasu@xxxxxxxxxxx
  http://www31.ocn.ne.jp/~yswww/myself/

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

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