From 1a8e34bfea3c2ed3bab3a9c6066d0ffdc564c641 Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Sat, 1 Oct 2016 13:26:53 -0700 Subject: [PATCH] Don't suggest grep -c when used with -o --- ShellCheck/ASTLib.hs | 15 ++++++++++----- ShellCheck/Analytics.hs | 10 ++++++++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/ShellCheck/ASTLib.hs b/ShellCheck/ASTLib.hs index e8ecb85..e4fdf93 100644 --- a/ShellCheck/ASTLib.hs +++ b/ShellCheck/ASTLib.hs @@ -211,14 +211,19 @@ braceExpand (T_NormalWord id list) = take 1000 $ do braceExpand item part x = return x --- Maybe get the command name of a token representing a command -getCommandName t = +-- Maybe get a SimpleCommand from immediate wrappers like T_Redirections +getCommand t = case t of - T_Redirecting _ _ w -> getCommandName w - T_SimpleCommand _ _ (w:_) -> getLiteralString w - T_Annotation _ _ t -> getCommandName t + T_Redirecting _ _ w -> getCommand w + T_SimpleCommand _ _ (w:_) -> return t + T_Annotation _ _ t -> getCommand t otherwise -> Nothing +-- Maybe get the command name of a token representing a command +getCommandName t = do + (T_SimpleCommand _ _ (w:_)) <- getCommand t + getLiteralString w + -- If a command substitution is a single command, get its name. -- $(date +%s) = Just "date" getCommandNameFromExpansion :: Token -> Maybe String diff --git a/ShellCheck/Analytics.hs b/ShellCheck/Analytics.hs index 0c31e17..c1d23e8 100644 --- a/ShellCheck/Analytics.hs +++ b/ShellCheck/Analytics.hs @@ -371,6 +371,8 @@ prop_checkPipePitfalls4 = verifyNot checkPipePitfalls "find . -print0 | xargs -0 prop_checkPipePitfalls5 = verifyNot checkPipePitfalls "ls -N | foo" prop_checkPipePitfalls6 = verify checkPipePitfalls "find . | xargs foo" prop_checkPipePitfalls7 = verifyNot checkPipePitfalls "find . -printf '%s\\n' | xargs foo" +prop_checkPipePitfalls8 = verify checkPipePitfalls "foo | grep bar | wc -l" +prop_checkPipePitfalls9 = verifyNot checkPipePitfalls "foo | grep -o bar | wc -l" checkPipePitfalls _ (T_Pipeline id _ commands) = do for ["find", "xargs"] $ \(find:xargs:_) -> @@ -390,8 +392,12 @@ checkPipePitfalls _ (T_Pipeline id _ commands) = do for' ["ps", "grep"] $ \x -> info x 2009 "Consider using pgrep instead of grepping ps output." - for' ["grep", "wc"] $ - \x -> style x 2126 "Consider using grep -c instead of grep|wc." + for ["grep", "wc"] $ + \(grep:wc:_) -> + let flags = fromMaybe [] $ map snd <$> getAllFlags <$> getCommand grep + in + unless (any (`elem` ["o", "only-matching"]) flags) $ + style (getId grep) 2126 "Consider using grep -c instead of grep|wc." didLs <- liftM or . sequence $ [ for' ["ls", "grep"] $