我有一个简单的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
命令的行。为什么会这样? env
命令是否在内部由execve
系统调用调用?我想知道以ruby
解释器二进制文件结尾的事件序列。
答案 0 :(得分:2)
shebang行中指定的解释器由内核本身在execve
调用中执行。
将您的脚本与简单的
进行比较#!/usr/bin/ruby
puts "Hello World"
如果您使用此脚本,您将只看到一个execve
调用:将您的脚本名称作为参数,而不是Ruby解释器。
有关详细信息,请查看load_script
kernel function。