ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:105625] [Ruby master Bug#15204] globbing should be prevented when wildcard is surrounded by double quotes in the ruby's command line
       [not found] <redmine.issue-15204.20181005082314.16128@ruby-lang.org>
@ 2021-10-12 18:47 ` jeremyevans0 (Jeremy Evans)
  0 siblings, 0 replies; only message in thread
From: jeremyevans0 (Jeremy Evans) @ 2021-10-12 18:47 UTC (permalink / raw)
  To: ruby-core

Issue #15204 has been updated by jeremyevans0 (Jeremy Evans).

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.

----------------------------------------
Bug #15204: globbing should be prevented when wildcard is surrounded by double quotes in the ruby's command line
https://bugs.ruby-lang.org/issues/15204#change-94114

* Author: LeiYuhou (Yuhou Lei)
* Status: Rejected
* Priority: Normal
* ruby -v: ruby 2.5.1p57 (2018-03-29 revision 63029) [x64-mswin64_140]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
script tt like following:

~~~ ruby
#!/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)


-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-10-12 18:47 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <redmine.issue-15204.20181005082314.16128@ruby-lang.org>
2021-10-12 18:47 ` [ruby-core:105625] [Ruby master Bug#15204] globbing should be prevented when wildcard is surrounded by double quotes in the ruby's command line jeremyevans0 (Jeremy Evans)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).