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

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


 しらいです。

In Message-Id <87hd8gzapd.wl%zn@xxxxxxxxxxxxx>
        Kazuhiro NISHIYAMA <zn@xxxxxxxxxxxxx>さんwrites:
> 西山和広です。

> >  最初の一個の引数は有効でしょう。二個目以降が無視されるだけ
> > のことで。
> 
> #!の行は空白の前までが実行ファイル名になって
> それ以降は空白も含めて1つの引数としてわたるだけ
> だと思っているのですが、無視される環境が
> あるのでしょうか?

 Solaris8 は source が非公開なので実装から追うしかないので
すが、実際に試してみると確かにそうなりますよ。逆にそうならな
い環境ってのはどういう環境でしょうか?

$ uname -a
SunOS solaris9 5.9 Generic_118559-11 i86pc i386 i86pc
$ cat a.c
#include <stdio.h>
int
main(int argc, char** argv)
{
    int i;
    for (i=0; i<argc; ++i)
        printf("%d:[%s]\n", i, argv[i]);
    return 0;
}
$ gcc a.c
$ cat a
#!./a.out -a -b
$ cat b.c
#include <stdio.h>
int
main(int argc, char** argv, char** envp)
{
    char *args[4];
    args[0] = "a";
    args[1] = "1";
    args[2] = "2";
    args[3] = NULL;
    execve("./a", args, envp);
}
$ gcc -o b b.c
$ ./b
0:[./a.out]
1:[-a]
2:[./a]
3:[1]
4:[2]
$ 

 shell が自身で「#!」を評価してしまうのを防ぐために、敢えて
execve() を使ってますが、確かに「-b」がどこかに消えてしまっ
てますね。
 手元の Solaris8 環境はコピペしにくいところにあるので、上の
例では Solaris9 の実行例をあげましたが、8 や 10 も同様の結果
になります。
 何なら OpenSolaris の source を紐解いても構いませんけど、
普通に一個目だけを評価するように実装されてると思いますよ。


> 以下のようなプログラムで確認しました。

 確かに Linux kernel だとそうなりますけど、本当に Solaris8
環境で確認してますか?option か何かで変わるものなのかしらん。

$ uname -a
Linux yuka 2.4.31-0vl1.8 #1 2005年 9月 5日 月曜日 03:33:25 JST i686 unknown
(中略)
$ ./b
0:[./a.out]
1:[-a -b]
2:[./a]
3:[1]
4:[2]
$ 

                                               しらい たかし

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

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