Linux 施特劳斯:一本书

Linux 施特劳斯:一本书,linux,strace,shebang,Linux,Strace,Shebang,我有一个简单的ruby脚本文件: #!/usr/bin/env ruby puts "Hello World" 当我使用strace运行此命令时: $ strace -s 100 -f ./script2 我获得以下成功的execve调用序列: execve("./script2", ["./script2"], [/* 85 vars */]) = 0 execve("/home/omar/.rvm/rubies/ruby-2.3.1/bin/ruby", ["ruby", "./scr

我有一个简单的ruby脚本文件:

#!/usr/bin/env ruby

puts "Hello World"
当我使用strace运行此命令时:

$ strace -s 100 -f ./script2
我获得以下成功的
execve
调用序列:

execve("./script2", ["./script2"], [/* 85 vars */]) = 0
execve("/home/omar/.rvm/rubies/ruby-2.3.1/bin/ruby", ["ruby", "./script2"], [/* 85 vars */]) = 0

我希望这些代码会出现,但输出中没有执行
/usr/bin/env
命令的任何行。为什么会这样?
execve
系统调用是否在内部调用
env
命令?我想知道以执行
ruby
解释器二进制文件结束的事件序列

shebang行中指定的解释器由内核本身在
execve
调用中执行

将您的脚本与简单的

#!/usr/bin/ruby

puts "Hello World"
如果您浏览这个脚本,您将只看到一个
execve
调用:以您的脚本名称作为参数的调用,而不是Ruby解释器

有关更多详细信息,请查看
load\u脚本