windows paths in shebang lines

Rafael Kitover rkitover@cpan.org
Tue Jan 25 15:51:00 GMT 2011


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



More information about the Cygwin mailing list