diff --git a/ShellCheck/Checker.hs b/ShellCheck/Checker.hs index 002ad1c..2bfdc94 100644 --- a/ShellCheck/Checker.hs +++ b/ShellCheck/Checker.hs @@ -147,6 +147,9 @@ prop_canSourceBadSyntax = prop_cantSourceDynamic = [1090] == checkWithIncludes [("lib", "")] ". \"$1\"" +prop_cantSourceDynamic2 = + [1090] == checkWithIncludes [("lib", "")] "source ~/foo" + prop_canSourceDynamicWhenRedirected = null $ checkWithIncludes [("lib", "")] "#shellcheck source=lib\n. \"$1\"" diff --git a/ShellCheck/Parser.hs b/ShellCheck/Parser.hs index 429daaf..912ff12 100644 --- a/ShellCheck/Parser.hs +++ b/ShellCheck/Parser.hs @@ -1536,7 +1536,11 @@ readSimpleCommand = called "simple command" $ do readSource :: Monad m => SourcePos -> Token -> SCParser m Token readSource pos t@(T_Redirecting _ _ (T_SimpleCommand _ _ (cmd:file:_))) = do override <- getSourceOverride - let literalFile = override `mplus` getLiteralString file + let literalFile = do + name <- override `mplus` getLiteralString file + -- Hack to avoid 'source ~/foo' trying to read from literal tilde + guard . not $ "~/" `isPrefixOf` name + return name case literalFile of Nothing -> do parseNoteAt pos WarningC 1090