On Sun, 14 Feb 2021 08:45:26 GMT, Chris Plummer <[email protected]> wrote:

> See the CR for a description of the 3 issues fixed. There's also a new test 
> added. I'll explain the fix related to quoting the '!' here since it's not 
> that obvious how it works.
> 
> There's a complex pattern called `historyPattern` that is used to find 
> various uses of ! to do expansion of commands and arguments in the history
> 
>     static Pattern historyPattern = 
> Pattern.compile("([\\\]?)((!\*)|(!\$)|(!!-?)|(!-?[0-9][0-9]*)|(![a-zA-Z][^ 
> ]*))");
> 
> I added the `([\\\]?)` part to handle allowing a '!' to be quoted with a 
> backslash so it will just be treated as a '!' instead of being used for 
> history expansion. This part of the pattern basically says match 1 backslash 
> if present. Yes, you need 4 backslashes to do this. javac will reduce it to 
> two, and then the pattern compilation reduces it down to just one backslash 
> (not to be used for quoting).
> 
> The above pattern for searching for the backslash before a '!' is in the 
> first pattern grouping, and the part that matches on the '!' and what follows 
> is in the 2nd pattern grouping. Thus the code I added checks if the first 
> pattern grouping matches something (and at most it will match just one 
> backslash), and if so then we eat it and don't treat the '!' that follows as 
> a history expansion:
> 
>                     if (m.group(1).length() != 0) {
>                         // This means we matched a `` before the '!'. Don't 
> do any history
>                         // expansion in this case. Just capture what matched 
> after the ``.
>                         result.append(m.group(2));
>                         continue;
>                     }

Marked as reviewed by amenkov (Reviewer).

-------------

PR: https://git.openjdk.java.net/jdk/pull/2565

Reply via email to