我想问一下,#!后面能执行啥样的程序。

zhao_yi707
我想问一下,#!后面能执行啥样的程序。

我有三个程序:
echoarg.c
[table=95%][tr][td][font=FixedSys][color=#000000][color=#0000FF]int[/color]
main[color=#0000CC]([/color][color=#0000FF]int[/color] argc[color=#0000CC],[/color] [color=#0000FF]char[/color][color=#0000CC]*[/color] argv[color=#0000CC][[/color][color=#0000CC]][/color][color=#0000CC])[/color] [color=#0000CC]{[/color]
    [color=#0000FF]int[/color] i[color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000FF]for[/color] [color=#0000CC]([/color]i [color=#0000CC]=[/color] 0[color=#0000CC];[/color] i [color=#0000CC]<[/color] argc[color=#0000CC];[/color] i[color=#0000CC]+[/color][color=#0000CC]+[/color][color=#0000CC])[/color] [color=#0000CC]{[/color]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]printf[/color][color=#0000CC]([/color][color=#FF00FF]"argv[%d]: %s/n"[/color][color=#0000CC],[/color] i[color=#0000CC],[/color] argv[color=#0000CC][[/color]i[color=#0000CC]][/color][color=#0000CC])[/color][color=#0000CC];[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#0000CC]}[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]exit[/color][color=#0000CC]([/color]0[color=#0000CC])[/color][color=#0000CC];[/color]
[color=#0000CC]}[/color]
[/color][/font][/td][/tr][/table]
echoarg.pl
[table=95%][tr][td][font=FixedSys][color=#000000][color=#FF9900]#!/usr/bin/perl
[/color]
[color=#FF9900]#
[/color]

[color=#0000FF]my[/color] [color=#0000FF]$[/color][color=#008080]t[/color] [color=#0000CC]=[/color] [color=#0000FF]$[/color][color=#FF9900]#ARGV;
[/color]
[color=#0000FF]foreach[/color] [color=#0000FF]my[/color] [color=#0000FF]$[/color][color=#008080]i[/color] [color=#0000CC]([/color]0[color=#0000CC].[/color][color=#0000CC].[/color][color=#0000FF]$[/color][color=#008080]t[/color][color=#0000CC])[/color] [color=#0000CC]{[/color]
&nbsp;&nbsp;&nbsp;&nbsp;[color=#FF0000]print[/color] [color=#FF00FF]"argv[$i]: "[/color] [color=#0000CC].[/color] [color=#0000FF]$[/color][color=#008080]ARGV[/color][color=#0000CC][[/color][color=#0000FF]$[/color][color=#008080]i[/color][color=#0000CC]][/color] [color=#0000CC].[/color] [color=#FF00FF]"/n"[/color][color=#0000CC];[/color]
[color=#0000CC]}[/color][/color][/font][/td][/tr][/table]
最后一个程序是:testinterp,这个程序只有如下一行
[quote]#!/tmp/echoarg foo
[/quote]

我的问题是,如果这个#!/tmp/echoarg 为前面的c程序编译后的文件即可以执行,如果#!/tmp/echoarg为这个pl程序即没有反应?
为什么呢?不解。

谢谢大家。

net_robber
#!表示脚本解释程序的位置

zhao_yi707
[quote]#!表示脚本解释程序的位置[/quote]

楼上的朋友能说清楚一点么,小弟还是不太明白:(
你的意思是,如果#!放在脚本程序里面和解释性文件里面是不一样的?

liubingqian
脚本语言是需要由解释器解释执行的(你编译过C程序,但编译Perl程序吗?)#!后面的内容就是告诉操作系统到什么地方去找解释器。
[quote]原帖由 [i]zhao_yi707[/i] 于 2008-6-30 11:30 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8701469&ptid=1184381][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
你的意思是,如果#!放在脚本程序里面和解释性文件里面是不一样的? [/quote]
是的,#!开头的行有特殊的含义,不是普通的注释。

[[i] 本帖最后由 liubingqian 于 2008-6-30 11:51 编辑 [/i]]

flw
to 二楼和四楼:
我认为楼主已经明白这个概念了。

他只是奇怪,为什么 echoarg.pl 不能做解释器,但 echoarg 就可以呢?
我猜测,解释器必须得是个 ELF 文件。
楼主可以验证一下。

jigloo2008
我觉得是perl的的脚本没有.pl后缀。
印象中execve处理#!是一个循环.

嗯,用cygwin(没linux)试了下,是这样。

[[i] 本帖最后由 jigloo2008 于 2008-6-30 12:22 编辑 [/i]]

sanor
可能是因为脚本他……本身还需要一个解释器。然后怎么怎么的。。不懂。

flw
找到了。
[url]http://lxr.linux.no/linux/fs/binfmt_script.c#L18[/url]

flw
看上去是有个递归过程的,不知道为什么实际上却没有。

zhao_yi707
flw, 是的,我已经明白了#!的含义,我看了一下你贴的代码。还是不是很明白里面的关键之处,能否指点一下,版主。

多谢。

reiase
木马:mrgreen: :mrgreen:

cjaizss
我曾经改写过的linux,
#!后面可以接n多参数,可以用#!文件来作解释器