X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW X-Spam-Check-By: sourceware.org Message-ID: <4D3ED50B.1060500@cpan.org> Date: Tue, 25 Jan 2011 08:50:03 -0500 From: Rafael Kitover Reply-To: rkitover AT cpan DOT org User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101207 Thunderbird/3.1.7 MIME-Version: 1.0 To: cygwin AT cygwin DOT com Subject: Re: windows paths in shebang lines References: <4D3CA1DA DOT 1000302 AT cpan DOT org> <4D3CB2ED DOT 5000801 AT bopp DOT net> <4D3CF157 DOT 9050705 AT cpan DOT org> In-Reply-To: <4D3CF157.9050705@cpan.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com 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 AT eeebox ~ >>> $ head -1 /cygdrive/c/Perl64/site/bin/ack >>> #!C:\Perl64\bin\perl >>> >>> rkitover AT 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 AT 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 AT 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