This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: windows paths in shebang lines


On 1/23/2011 6:12 PM, Andrew DeFaria wrote:
On 01/23/2011 05:59 PM, Jeremy Bopp wrote:
On 01/23/2011 03:47 PM, Rafael Kitover wrote:
When a script's shebang line has a windows path, rather than a cygwin
path, it does not work:

rkitover@eeebox ~
$ head -1 /cygdrive/c/Perl64/site/bin/ack
#!C:\Perl64\bin\perl

rkitover@eeebox ~
$ /cygdrive/c/Perl64/site/bin/ack --version
Can't open perl script "/cygdrive/c/Perl64/site/bin/ack": No such file
or directory

On msys (msysGit) this works correctly:

rkitover@EEEBOX ~
$ /c/Perl64/site/bin/ack --version
ack 1.94
Running under Perl 5.12.2 at C:\Perl64\bin\perl.exe

Copyright 2005-2010 Andy Lester.

This program is free software. You may modify or distribute it
under the terms of the Artistic License v2.0.

Any chance this could be fixed? This would be a very nice feature for
users of Strawberry Perl and similar.
The problem is not that you're using a Windows path instead of a Cygwin
path in the shebang line; although, that is not officially supported
under Cygwin. Rather, the problem is that the version of Perl being run
as a result of that shebang line does not understand Cygwin paths.
That's why you see this error:

Can't open perl script "/cygdrive/c/Perl64/site/bin/ack": No such file
or directory

That's the Perl interpreter telling you that it doesn't understand the
path that was given to it for the ack script, so Perl is running at this
point which means that the shebang line is understood correctly. You
should probably go read about how shebang lines work in general, but the
short and sweet is that the shebang line is the first part of a command
line to be run where the last part is the command line used to run the
file that contains the shebang line itself. IOW, the command line used
in your first example is ultimately:

C:\Perl64\bin\perl /cygdrive/c/Perl64/site/bin/ack --version

You have 3 potential solutions to your problem:

1) Run Perl explicitly with the Windows path to the script as an
argument:
/cygdrive/c/Perl64/bin/perl C:/Perl64/site/bin/ack

2) Change into the C: drive and use a relative path to the ack script
when you run it:
cd /cygdrive/c
Perl64/site/bin/ack

3) Change your cygdrive mount location to / so that the path to the ack
script will be /c/Perl64/site/bin/ack under Cygwin.

Option 3 is the real hack. I think it should work because it appears in
your successful example that the Perl you want to use is able to
translate paths such as /c/path/to/something to C:/path/to/something
internally. By adjusting the cygdrive mount location to /, you will
cause Cygwin to send a compatible path to Perl when you run the script
as /c/Perl64/site/bin/ack.

-Jeremy

My question would be: Why are you running a C:\Perl64\bin\perl.exe
instead of just running /usr/bin/perl (AKA C:/Cygwin/bin/perl.exe)? IOW
why are you not running Cygwin's Perl. My guess is that
C:\Perl64\bin\perl.exe is some ActiveState based Perl and you'll only
run into problems using that with a "Cygwin frame of mine". Just run
Cygwin's Perl instead!

But I do! :)


I'm a CPAN developer, I love all perls and run as many of them as possible :)

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]