On Tue, Jun 16, 2009 at 4:22 AM, Bram Moolenaar<[email protected]> wrote:
>
> Hari Krishna Dara wrote:
>
>> I have been using a custom function called genutils#EscapeCommand()
>> (available as part of genutils.vim library) in all my plugins but
>> always wanted something native in Vim. I was very excited to see
>> shellescape() function when it was included in a recent Vim release,
>> however I find that its implementation is not accurate, at least for
>> windows when cygwin shell is used. This is a special condition on
>> windows because the arguments somewhat get seen by native programs as
>> well as the cygwin shell. As a simple example, let us say we want to
>> run the command 'ls a"b' (without outer quotes) where the filename is
>> 'a"b' (without outer quotes). On dos cmd.exe, it would be:
>>
>> > ls "a""b"
>> ls: cannot access a"b: No such file or directory
>>
>> on bash prompt, it would be:
>>
>> $ ls 'a"b'
>> ls: cannot access a"b: No such file or directory
>>
>> Let us try the same from Vim. Start a clean vim instance using -u NONE
>> option (which guarantees 'noshellslash' and "cmd.exe" for 'shell') and
>> try:
>>
>> :exec '!ls '. shellescape('a"b')
>>
>> and you would see the below as expected:
>>
>> C:\WINDOWS\system32\cmd.exe /c ls "a""b"
>> ls: cannot access a"b: No such file or directory
>> shell returned 2
>> Hit any key to close this window...
>>
>> Let us try the same with cygwin as shell:
>>
>> :set shell=c:/cygwin/bin/bash.exe
>> :set shellcmdflag=-c
>> :set shellslash
>> :set shellredir=>%s\ 2>&1
>> :set shellpipe=2>&1\|\ tee
>> :set shellxquote=\"
>> :exec '!ls '. shellescape('a"b')
>>
>> What we get is:
>>
>> c:/cygwin/bin/bash.exe -c "ls 'a"b'"
>> /usr/bin/bash: -c: line 0: unexpected EOF while looking for matching `''
>> /usr/bin/bash: -c: line 1: syntax error: unexpected end of file
>> shell returned 2
>> Hit any key to close this window...
>>
>> This is because the command-line is seen by native command-line parser
>> as well which expects the inner double-quote be doubled. The below
>> works as expected:
>>
>> :exec '!ls '. shellescape('a""b')
>>
>> but this requires checking for platform and shell and so defeats the
>> purpose of shellescape().
>>
>> I have also noticed that shellescape() is not sensitive to
>> 'shellquote' and 'shellxquote' settings. E.g., if you try the below
>> settings on top of the previous:
>>
>> :shellxquote='
>> :exec '!ls '. shellescape('a""b')
>>
>> you get:
>>
>> c:/cygwin/bin/bash.exe -c 'ls 'a""b''
>> ls: cannot access ab: No such file or directory
>> shell returned 2
>> Hit any key to close this window...
>>
>> Obviously, Vim didn't replace the inner single quotes, when it could
>> very well know that the 'shellxquote' would cause an outer set of
>> single quotes.
>>
>> For now I am sticking to my genutils#EscapeCommand() such they work in
>> more vim environments, and hope that the built-in function will be
>> improved to work with these and other possible scenarios.
>
> You can't really expect shellescape() to work in all environments with
> all possible combination of option values.
>
> First of all, using a Unix shell on windows is already a problem, it
> makes it very tricky to handle the mixed environment.  You can have
> cmd.exe excute a Unix shell that executes a DOS command.  Then where do
> you put quotes and what does a backslash mean?  It becomes a wonderful
> puzzle.  It comes down to that the option values depend on the command
> you want to execute.  E.g., "ls" requires forward slashes while "dir"
> requires backslashes in the path.

The shellslash() would give plugin writers a false sense that it is a
cross-platform tool to execute external commands, so at least
documenting the combinations that work/don't work will be helpful.

>
> Did you try unsetting shellslash?

I didn't but it will probably cause others issues when using a unix
shell (e.g., the path separator characters).

-- Hari

>
> --
> If Pacman had affected us as kids we'd be running around in dark rooms,
> munching pills and listening to repetitive music.
>                       -- Marcus Brigstocke
>
>  /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
> ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
> \\\        download, build and distribute -- http://www.A-A-P.org        ///
>  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
>

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_use" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Reply via email to