Merge pull request #883 from sheenobu/bugfix/ruby_shebang

Workaround to support ruby as an interpreter
This commit is contained in:
Eelco Dolstra 2016-05-03 11:14:21 +02:00
commit 80f739b571

View file

@ -184,17 +184,31 @@ for (my $n = 0; $n < scalar @ARGV; $n++) {
$n++; $n++;
die "$0: $arg requires an argument\n" unless $n < scalar @ARGV; die "$0: $arg requires an argument\n" unless $n < scalar @ARGV;
my $interpreter = $ARGV[$n]; my $interpreter = $ARGV[$n];
# Überhack to support Perl. Perl examines the shebang and my $execArgs = "";
# executes it unless it contains the string "perl" or "indir",
# or (undocumented) argv[0] does not contain "perl". Exploit
# the latter by doing "exec -a".
my $execArgs = $interpreter =~ /perl/ ? "-a PERL" : "";
sub shellEscape { sub shellEscape {
my $s = $_; my $s = $_;
$s =~ s/'/'\\''/g; $s =~ s/'/'\\''/g;
return "'" . $s . "'"; return "'" . $s . "'";
} }
$envCommand = "exec $execArgs $interpreter $script ${\(join ' ', (map shellEscape, @savedArgs))}";
# Überhack to support Perl. Perl examines the shebang and
# executes it unless it contains the string "perl" or "indir",
# or (undocumented) argv[0] does not contain "perl". Exploit
# the latter by doing "exec -a".
if ($interpreter =~ /perl/) {
$execArgs = "-a PERL";
}
if ($interpreter =~ /ruby/) {
# Hack for Ruby. Ruby also examines the shebang. It tries to
# read the shebang to understand which packages to read from. Since
# this is handled via nix-shell -p, we wrap our ruby script execution
# in ruby -e 'load' which ignores the shebangs.
$envCommand = "exec $execArgs $interpreter -e 'load(\"$script\")' -- ${\(join ' ', (map shellEscape, @savedArgs))}";
} else {
$envCommand = "exec $execArgs $interpreter $script ${\(join ' ', (map shellEscape, @savedArgs))}";
}
} }
elsif (substr($arg, 0, 1) eq "-") { elsif (substr($arg, 0, 1) eq "-") {