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 10:26 PM, Rafael Kitover wrote:
On 1/23/2011 5: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

Ahh yes, I wasn't thinking about this clearly, thank you for the explanation :)


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

Unfortunately, that's not enough to get it to work:


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

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

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

msys seems to do something special for this to work correctly, it also
seems to translate its paths to windows paths when running windows
executables automatically, a very nice feature.

For this to work in cygwin I'd have to do something like mount c: as /,
which I'm guessing would break absolutely everything :)

I got this to work!


Along with "mount -c /" I did this:

mklink /D c:\c c:\

to create a directory junction.

Now:

$ head -1 /c/Perl64/site/bin/ack
#!C:\Perl64\bin\perl

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

Yay!

Now I just need to convince activestate to use proper shebang lines instead of #!/usr/bin/perl .

--
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]