Project

General

Profile

Actions

Bug #15204

closed

globbing should be prevented when wildcard is surrounded by double quotes in the ruby's command line

Added by LeiYuhou (Yuhou Lei) over 5 years ago. Updated over 2 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 2.5.1p57 (2018-03-29 revision 63029) [x64-mswin64_140]
[ruby-core:89282]
Tags:

Description

script tt like following:

#!/usr/bin/ruby
p ARGV

if a command line argument contains wildcard such as * or ? is surrounded by double quotes , the script's results are different between Linux and Windows.
when run tt in Linux's bash :
$ ./tt ".txt"
it's output is : ["
.txt"]

but when run tt in Windows 10(x64)'s Command Prompter cmd.exe :
c:> ruby tt.rb "*.exe"
it's output is ["a.txt" , "b.txt" , "c.txt"]

I know , If enclosed with single quote, the behavior are same in Linux and Windows.
I think it's behavior should be exactly same whenever any OS or Shell . otherwise it will bring many trouble to developers , think of the following sceneļ¼š
users maybe pass asterisk(*) in the command line arguments to my script , to prevent bash to expand it , I will request users to enclose this parameter with double quotes, this will work fine in Linux . but when it 's run in windows , it will fail .

Bash will expand wildcard with globbing before passing the arguments to ruby process , the function w32_cmdvector in win32/win32.c does the same thing like Bash, Just add a condition , the bug will be fixed.

Index: win32/win32.c

--- win32/win32.c (revision 64922)
+++ win32/win32.c (working copy)
@@ -1733,7 +1733,7 @@
// N.B. Don't glob if inside a single quoted string
//

  •           if (quote != L'\'')
    
  •           if (quote != L'\'' && quote != L'"')
                  globbing++;
              slashes = 0;
              break;
    

Files

ruby-changes.patch (350 Bytes) ruby-changes.patch LeiYuhou (Yuhou Lei), 10/05/2018 08:20 AM

Updated by LeiYuhou (Yuhou Lei) over 5 years ago

sorry, maybe some text was modified by the bug tracker Editor :-)
In Linux's bash

$ ./tt "*.txt"
it's output is : ["*.txt"]

my patch's content:

Index: win32/win32.c
===================================================================
--- win32/win32.c       (revision 64922)
+++ win32/win32.c       (working copy)
@@ -1733,7 +1733,7 @@
                // N.B. Don't glob if inside a single quoted string
                //

-               if (quote != L'\'')
+               if (quote != L'\'' && quote != L'"')
                    globbing++;
                slashes = 0;
                break;

Updated by jeremyevans0 (Jeremy Evans) over 2 years ago

  • Status changed from Open to Rejected

The history indicates the current behavior is expected, and I agree. Globbing inside double quotes is not done by Linux/Unix shells, but is done on Windows:

C:\Users\jeremye>dir /b D*
Desktop
Documents
Downloads

C:\Users\jeremye>dir /b "D*"
Desktop
Documents
Downloads

C:\Users\jeremye>dir /b 'D*'
File Not Found

It's better for Ruby to be consistent with the behavior of the shell on the same operating system, instead of being consistent with the shell of other operating systems. If you would like your users to have consistent behavior between Windows and Linux, you'll need to inform users to always use single quotes if they do not want globbing.

Actions

Also available in: Atom PDF

Like0
Like0Like0