Added checks for multiple pipe combinations.
This commit is contained in:
parent
7e3712f853
commit
6977963124
|
@ -40,6 +40,7 @@ checkList l t m = foldl (\x f -> f t x) m l
|
|||
runBasicAnalysis f t m = snd $ runState (doAnalysis f t) m
|
||||
basicChecks = [
|
||||
checkUuoc
|
||||
,checkPipePitfalls
|
||||
,checkForInQuoted
|
||||
,checkForInLs
|
||||
,checkUnquotedExpansions
|
||||
|
@ -115,6 +116,35 @@ checkUuoc (T_Pipeline _ (T_Redirecting _ _ f@(T_SimpleCommand id _ _):_:_)) =
|
|||
_ -> return ()
|
||||
checkUuoc _ = return ()
|
||||
|
||||
prop_checkPipePitfalls1 = verify checkPipePitfalls "foo | grep foo | awk bar"
|
||||
prop_checkPipePitfalls2 = verifyNot checkPipePitfalls "foo | awk bar | grep foo"
|
||||
prop_checkPipePitfalls3 = verify checkPipePitfalls "ls | grep -v mp3"
|
||||
checkPipePitfalls (T_Pipeline id commands) = do
|
||||
for [["grep"], ["awk"]] $ \id -> style id "You don't need grep | awk, awk can filter lines by itself."
|
||||
for [["ls"], ["?"]] $ \id -> warn id "Don't parse ls output; it mangles filenames."
|
||||
for [["ls"], ["grep"]] $ \id -> warn id "Don't use ls | grep. Use a for loop with a condition in it."
|
||||
for [["ls"], ["xargs"]] $ \id -> warn id "Don't use ls | xargs. Use find -exec .. +"
|
||||
for [["find"], ["xargs"]]$ \id -> warn id "Don't use find | xargs cmd. find -exec cmd {} + handles whitespace."
|
||||
for [["?"], ["echo"]] $ \id -> info id "echo doesn't read from stdin, are you sure you should be piping to it?"
|
||||
where
|
||||
for l f =
|
||||
let indices = indexOfSublists l (map (take 1 . deadSimple) commands)
|
||||
in mapM_ f (map (\n -> getId $ commands !! n) indices)
|
||||
checkPipePitfalls _ = return ()
|
||||
|
||||
indexOfSublists sub all = f 0 all
|
||||
where
|
||||
f _ [] = []
|
||||
f n a@(r:rest) =
|
||||
let others = f (n+1) rest in
|
||||
if match sub (take (length sub) a)
|
||||
then n:others
|
||||
else others
|
||||
match [] [] = True
|
||||
match (["?"]:r1) (_:r2) = match r1 r2
|
||||
match (x1:r1) (x2:r2) | x1 == x2 = match r1 r2
|
||||
match _ _ = False
|
||||
|
||||
|
||||
isMagicInQuotes (T_DollarBraced _ s) | '@' `elem` s = True
|
||||
isMagicInQuotes _ = False
|
||||
|
|
Loading…
Reference in New Issue