Properly handle escaped double quotes in quoted backtick expressions.
This commit is contained in:
parent
a66ee2967c
commit
1a5296659b
|
@ -2565,6 +2565,7 @@ prop_checkSpacefulness27= verifyNotTree checkSpacefulness "echo ${a:+'foo'}"
|
||||||
prop_checkSpacefulness28= verifyNotTree checkSpacefulness "exec {n}>&1; echo $n"
|
prop_checkSpacefulness28= verifyNotTree checkSpacefulness "exec {n}>&1; echo $n"
|
||||||
prop_checkSpacefulness29= verifyNotTree checkSpacefulness "n=$(stuff); exec {n}>&-;"
|
prop_checkSpacefulness29= verifyNotTree checkSpacefulness "n=$(stuff); exec {n}>&-;"
|
||||||
prop_checkSpacefulness30= verifyTree checkSpacefulness "file='foo bar'; echo foo > $file;"
|
prop_checkSpacefulness30= verifyTree checkSpacefulness "file='foo bar'; echo foo > $file;"
|
||||||
|
prop_checkSpacefulness31= verifyNotTree checkSpacefulness "echo \"`echo \\\"$1\\\"`\""
|
||||||
|
|
||||||
checkSpacefulness params t =
|
checkSpacefulness params t =
|
||||||
doVariableFlowAnalysis readF writeF (Map.fromList defaults) (variableFlow params)
|
doVariableFlowAnalysis readF writeF (Map.fromList defaults) (variableFlow params)
|
||||||
|
|
|
@ -623,7 +623,7 @@ readArithmeticContents =
|
||||||
readDoubleQuoted,
|
readDoubleQuoted,
|
||||||
readNormalDollar,
|
readNormalDollar,
|
||||||
readBraced,
|
readBraced,
|
||||||
readBackTicked,
|
readUnquotedBackTicked,
|
||||||
readNormalLiteral "+-*/=%^,]?:"
|
readNormalLiteral "+-*/=%^,]?:"
|
||||||
]
|
]
|
||||||
spacing
|
spacing
|
||||||
|
@ -833,7 +833,7 @@ readNormalWordPart end = do
|
||||||
readGlob,
|
readGlob,
|
||||||
readNormalDollar,
|
readNormalDollar,
|
||||||
readBraced,
|
readBraced,
|
||||||
readBackTicked,
|
readUnquotedBackTicked,
|
||||||
readProcSub,
|
readProcSub,
|
||||||
readNormalLiteral end,
|
readNormalLiteral end,
|
||||||
readLiteralCurlyBraces
|
readLiteralCurlyBraces
|
||||||
|
@ -869,7 +869,7 @@ readDollarBracedWord = do
|
||||||
list <- many readDollarBracedPart
|
list <- many readDollarBracedPart
|
||||||
return $ T_NormalWord id list
|
return $ T_NormalWord id list
|
||||||
|
|
||||||
readDollarBracedPart = readSingleQuoted <|> readDoubleQuoted <|> readExtglob <|> readNormalDollar <|> readBackTicked <|> readDollarBracedLiteral
|
readDollarBracedPart = readSingleQuoted <|> readDoubleQuoted <|> readExtglob <|> readNormalDollar <|> readUnquotedBackTicked <|> readDollarBracedLiteral
|
||||||
|
|
||||||
readDollarBracedLiteral = do
|
readDollarBracedLiteral = do
|
||||||
id <- getNextId
|
id <- getNextId
|
||||||
|
@ -927,15 +927,18 @@ readSingleQuotedPart =
|
||||||
readSingleEscaped
|
readSingleEscaped
|
||||||
<|> many1 (noneOf "'\\\x2018\x2019")
|
<|> many1 (noneOf "'\\\x2018\x2019")
|
||||||
|
|
||||||
prop_readBackTicked = isOk readBackTicked "`ls *.mp3`"
|
|
||||||
prop_readBackTicked2 = isOk readBackTicked "`grep \"\\\"\"`"
|
prop_readBackTicked = isOk (readBackTicked False) "`ls *.mp3`"
|
||||||
prop_readBackTicked3 = isWarning readBackTicked "´grep \"\\\"\"´"
|
prop_readBackTicked2 = isOk (readBackTicked False) "`grep \"\\\"\"`"
|
||||||
prop_readBackTicked4 = isOk readBackTicked "`echo foo\necho bar`"
|
prop_readBackTicked3 = isWarning (readBackTicked False) "´grep \"\\\"\"´"
|
||||||
|
prop_readBackTicked4 = isOk readSimpleCommand "`echo foo\necho bar`"
|
||||||
prop_readBackTicked5 = isOk readSimpleCommand "echo `foo`bar"
|
prop_readBackTicked5 = isOk readSimpleCommand "echo `foo`bar"
|
||||||
prop_readBackTicked6 = isWarning readSimpleCommand "echo `foo\necho `bar"
|
prop_readBackTicked6 = isWarning readSimpleCommand "echo `foo\necho `bar"
|
||||||
prop_readBackTicked7 = isOk readSimpleCommand "`#inline comment`"
|
prop_readBackTicked7 = isOk readSimpleCommand "`#inline comment`"
|
||||||
prop_readBackTicked8 = isOk readSimpleCommand "echo `#comment` \\\nbar baz"
|
prop_readBackTicked8 = isOk readSimpleCommand "echo `#comment` \\\nbar baz"
|
||||||
readBackTicked = called "backtick expansion" $ do
|
readQuotedBackTicked = readBackTicked True
|
||||||
|
readUnquotedBackTicked = readBackTicked False
|
||||||
|
readBackTicked quoted = called "backtick expansion" $ do
|
||||||
id <- getNextId
|
id <- getNextId
|
||||||
startPos <- getPosition
|
startPos <- getPosition
|
||||||
backtick
|
backtick
|
||||||
|
@ -954,6 +957,7 @@ readBackTicked = called "backtick expansion" $ do
|
||||||
return $ T_Backticked id result
|
return $ T_Backticked id result
|
||||||
where
|
where
|
||||||
unEscape [] = []
|
unEscape [] = []
|
||||||
|
unEscape ('\\':'"':rest) | quoted = '"' : unEscape rest
|
||||||
unEscape ('\\':x:rest) | x `elem` "$`\\" = x : unEscape rest
|
unEscape ('\\':x:rest) | x `elem` "$`\\" = x : unEscape rest
|
||||||
unEscape ('\\':'\n':rest) = unEscape rest
|
unEscape ('\\':'\n':rest) = unEscape rest
|
||||||
unEscape (c:rest) = c : unEscape rest
|
unEscape (c:rest) = c : unEscape rest
|
||||||
|
@ -1021,7 +1025,7 @@ suggestForgotClosingQuote startPos endPos name = do
|
||||||
parseProblemAt endPos InfoC 1079
|
parseProblemAt endPos InfoC 1079
|
||||||
"This is actually an end quote, but due to next char it looks suspect."
|
"This is actually an end quote, but due to next char it looks suspect."
|
||||||
|
|
||||||
doubleQuotedPart = readDoubleLiteral <|> readDoubleQuotedDollar <|> readBackTicked
|
doubleQuotedPart = readDoubleLiteral <|> readDoubleQuotedDollar <|> readQuotedBackTicked
|
||||||
|
|
||||||
readDoubleQuotedLiteral = do
|
readDoubleQuotedLiteral = do
|
||||||
doubleQuote
|
doubleQuote
|
||||||
|
|
Loading…
Reference in New Issue