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

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