2017-01-15 1 views
1

J'ai un simple fichier script Ruby:strace un script tralala

#!/usr/bin/env ruby 

puts "Hello World" 

Quand je lance ce en utilisant strace:

$ strace -s 100 -f ./script2 

-je obtenir la séquence suivante de execve succès appels:

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

je m'attendais à être présent, mais la sortie n'a aucune ligne qui exécute le /usr/bin/env commande. Pourquoi cela est-il ainsi? La commande env est-elle invoquée par l'appel système execve en interne? Je veux connaître la séquence d'événements qui se termine par le binaire interpréteur ruby en cours d'exécution.

Répondre

2

L'interpréteur spécifié dans la ligne shebang est exécuté par le noyau lui-même à l'intérieur de l'appel execve.

Comparez votre script avec un simple

#!/usr/bin/ruby 

puts "Hello World" 

Si vous STRACE ce script, vous verrez qu'un seul execve appel: l'un avec votre nom de script comme argument, et non l'interpréteur Ruby. Pour plus de détails, consultez le load_scriptkernel function.

+0

C'est ce que je cherchais, merci. –