所以,我以为我对此有很好的了解,但是只是进行了一次测试(以回应我不同意某人的对话),发现我的理解是有缺陷的...
尽可能详细地说明我在Shell中执行文件时会发生什么情况?我的意思是,如果我键入以下内容:如果./somefile some arguments
在外壳中键入内容,然后按return键(somefile
并存在于cwd中,并且我具有的读取和执行权限somefile
),那么在幕后会发生什么?
我以为答案是:
- Shell进行syscall
exec
,将路径传递给somefile
- 内核检查
somefile
并查看文件的幻数,以确定它是否是处理器可以处理的格式 - 如果幻数表示文件是处理器可以执行的格式,则
- 创建一个新流程(在流程表中有一个条目)
somefile
被读取/映射到内存。创建一个堆栈,执行跳转到的代码的入口点somefile
,并ARGV
初始化为参数数组(achar**
,["some","arguments"]
)
- 如果幻数是shebang,则
exec()
如上所述产生一个新进程,但是使用的可执行文件是shebang引用的解释器(例如/bin/bash
或/bin/perl
),somefile
并传递给STDIN
- 如果文件没有有效的幻数,则发生类似“无效文件(不良幻数):执行格式错误”的错误
但是有人告诉我,如果文件是纯文本,那么Shell会尝试执行命令(就像我键入一样bash somefile
)。我不相信这一点,但我只是尝试了一下,这是正确的。因此,我显然对这里实际发生的事情有一些误解,并且想了解其机制。
当我在shell中执行文件时,会发生什么情况?(尽可能多的细节是合理的...)
source somefile
不过,与所产生的新过程有很大的不同./somefile
。
./somefile
不会导致bash执行命令somefile
。我认为它只会显示一个错误,而实际上似乎有效source somefile
somefile
是文本文件,那么如果我尝试执行它,就会生成一个新的shell。echo $$
如果我执行vs源文件,文件的行为会有所不同。