Add warnings about redirections without commands.
This commit is contained in:
parent
6ccb7e9129
commit
f594f01d35
|
@ -156,6 +156,7 @@ nodeChecks = [
|
||||||
,checkLoopVariableReassignment
|
,checkLoopVariableReassignment
|
||||||
,checkTrailingBracket
|
,checkTrailingBracket
|
||||||
,checkReturnAgainstZero
|
,checkReturnAgainstZero
|
||||||
|
,checkRedirectedNowhere
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -2536,5 +2537,38 @@ checkReturnAgainstZero _ token =
|
||||||
otherwise -> False
|
otherwise -> False
|
||||||
message id = style id 2181 "Check exit code directly with e.g. 'if mycmd;', not indirectly with $?."
|
message id = style id 2181 "Check exit code directly with e.g. 'if mycmd;', not indirectly with $?."
|
||||||
|
|
||||||
|
prop_checkRedirectedNowhere1 = verify checkRedirectedNowhere "> file"
|
||||||
|
prop_checkRedirectedNowhere2 = verify checkRedirectedNowhere "> file | grep foo"
|
||||||
|
prop_checkRedirectedNowhere3 = verify checkRedirectedNowhere "grep foo | > bar"
|
||||||
|
prop_checkRedirectedNowhere4 = verifyNot checkRedirectedNowhere "grep foo > bar"
|
||||||
|
prop_checkRedirectedNowhere5 = verifyNot checkRedirectedNowhere "foo | grep bar > baz"
|
||||||
|
prop_checkRedirectedNowhere6 = verifyNot checkRedirectedNowhere "var=$(value) 2> /dev/null"
|
||||||
|
prop_checkRedirectedNowhere7 = verifyNot checkRedirectedNowhere "var=$(< file)"
|
||||||
|
prop_checkRedirectedNowhere8 = verifyNot checkRedirectedNowhere "var=`< file`"
|
||||||
|
checkRedirectedNowhere params token =
|
||||||
|
case token of
|
||||||
|
T_Pipeline _ _ [single] -> potentially $ do
|
||||||
|
redir <- getDanglingRedirect single
|
||||||
|
guard . not $ isInExpansion token
|
||||||
|
return $ warn (getId redir) 2188 "This redirection doesn't have a command. Move to its command (or use 'true' as no-op)."
|
||||||
|
|
||||||
|
T_Pipeline _ _ list -> forM_ list $ \x -> potentially $ do
|
||||||
|
redir <- getDanglingRedirect x
|
||||||
|
return $ err (getId redir) 2189 "You can't have | between this redirection and the command it should apply to."
|
||||||
|
|
||||||
|
_ -> return ()
|
||||||
|
where
|
||||||
|
isInExpansion t =
|
||||||
|
case drop 1 $ getPath (parentMap params) t of
|
||||||
|
T_DollarExpansion _ [_] : _ -> True
|
||||||
|
T_Backticked _ [_] : _ -> True
|
||||||
|
T_Annotation _ _ u : _ -> isInExpansion u
|
||||||
|
_ -> False
|
||||||
|
getDanglingRedirect token =
|
||||||
|
case token of
|
||||||
|
T_Redirecting _ (first:_) (T_SimpleCommand _ [] []) -> return first
|
||||||
|
_ -> Nothing
|
||||||
|
|
||||||
|
|
||||||
return []
|
return []
|
||||||
runTests = $( [| $(forAllProperties) (quickCheckWithResult (stdArgs { maxSuccess = 1 }) ) |])
|
runTests = $( [| $(forAllProperties) (quickCheckWithResult (stdArgs { maxSuccess = 1 }) ) |])
|
||||||
|
|
Loading…
Reference in New Issue