2017-01-15 18 views
1

У меня есть простой файл рубинового скрипта:Трассирования скрипт притона

#!/usr/bin/env ruby 

puts "Hello World" 

Когда я запускаю это, используя Трассирование:

$ 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.

ответ

2

Интерпретатор, указанный в строке shebang, выполняется самим ядром внутри вызова execve.

Сравните ваш сценарий с простым

#!/usr/bin/ruby 

puts "Hello World" 

Если вы Трассированием этого скрипта, вы увидите только один execve вызова: один с вашим именем сценария в качестве аргумента, а не интерпретатор Ruby.

Для получения более подробной информации смотрите load_scriptkernel function.

+0

Это то, что я искал, спасибо. –