Support env -S/--split-string in shebangs (fixes #2105)
This commit is contained in:
parent
6ba1af0898
commit
cc3884cf9f
|
@ -13,6 +13,7 @@
|
||||||
- SC1072/SC1073 now respond to disable annotations, though ignoring parse errors
|
- SC1072/SC1073 now respond to disable annotations, though ignoring parse errors
|
||||||
is still purely cosmetic and does not allow ShellCheck to continue.
|
is still purely cosmetic and does not allow ShellCheck to continue.
|
||||||
- Improved error reporting for trailing tokens after ]/]] and compound commands
|
- Improved error reporting for trailing tokens after ]/]] and compound commands
|
||||||
|
- `#!/usr/bin/env -S shell` is now handled correctly
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Assignments are now parsed to spec, without leniency for leading $ or spaces
|
- Assignments are now parsed to spec, without leniency for leading $ or spaces
|
||||||
|
|
|
@ -546,9 +546,14 @@ indexOfSublists sub = f 0
|
||||||
|
|
||||||
prop_checkShebangParameters1 = verifyTree checkShebangParameters "#!/usr/bin/env bash -x\necho cow"
|
prop_checkShebangParameters1 = verifyTree checkShebangParameters "#!/usr/bin/env bash -x\necho cow"
|
||||||
prop_checkShebangParameters2 = verifyNotTree checkShebangParameters "#! /bin/sh -l "
|
prop_checkShebangParameters2 = verifyNotTree checkShebangParameters "#! /bin/sh -l "
|
||||||
|
prop_checkShebangParameters3 = verifyNotTree checkShebangParameters "#!/usr/bin/env -S bash -x\necho cow"
|
||||||
|
prop_checkShebangParameters4 = verifyNotTree checkShebangParameters "#!/usr/bin/env --split-string bash -x\necho cow"
|
||||||
checkShebangParameters p (T_Annotation _ _ t) = checkShebangParameters p t
|
checkShebangParameters p (T_Annotation _ _ t) = checkShebangParameters p t
|
||||||
checkShebangParameters _ (T_Script _ (T_Literal id sb) _) =
|
checkShebangParameters _ (T_Script _ (T_Literal id sb) _) =
|
||||||
[makeComment ErrorC id 2096 "On most OS, shebangs can only specify a single parameter." | length (words sb) > 2]
|
[makeComment ErrorC id 2096 "On most OS, shebangs can only specify a single parameter." | isMultiWord]
|
||||||
|
where
|
||||||
|
isMultiWord = length (words sb) > 2 && not (sb `matches` re)
|
||||||
|
re = mkRegex "env +(-S|--split-string)"
|
||||||
|
|
||||||
prop_checkShebang1 = verifyNotTree checkShebang "#!/usr/bin/env bash -x\necho cow"
|
prop_checkShebang1 = verifyNotTree checkShebang "#!/usr/bin/env bash -x\necho cow"
|
||||||
prop_checkShebang2 = verifyNotTree checkShebang "#! /bin/sh -l "
|
prop_checkShebang2 = verifyNotTree checkShebang "#! /bin/sh -l "
|
||||||
|
|
|
@ -238,6 +238,8 @@ prop_determineShell5 = determineShellTest "#shellcheck shell=sh\nfoo" == Sh
|
||||||
prop_determineShell6 = determineShellTest "#! /bin/sh" == Sh
|
prop_determineShell6 = determineShellTest "#! /bin/sh" == Sh
|
||||||
prop_determineShell7 = determineShellTest "#! /bin/ash" == Dash
|
prop_determineShell7 = determineShellTest "#! /bin/ash" == Dash
|
||||||
prop_determineShell8 = determineShellTest' (Just Ksh) "#!/bin/sh" == Sh
|
prop_determineShell8 = determineShellTest' (Just Ksh) "#!/bin/sh" == Sh
|
||||||
|
prop_determineShell9 = determineShellTest "#!/bin/env -S dash -x" == Dash
|
||||||
|
prop_determineShell10 = determineShellTest "#!/bin/env --split-string= dash -x" == Dash
|
||||||
|
|
||||||
determineShellTest = determineShellTest' Nothing
|
determineShellTest = determineShellTest' Nothing
|
||||||
determineShellTest' fallbackShell = determineShell fallbackShell . fromJust . prRoot . pScript
|
determineShellTest' fallbackShell = determineShell fallbackShell . fromJust . prRoot . pScript
|
||||||
|
@ -256,10 +258,12 @@ determineShell fallbackShell t = fromMaybe Bash $
|
||||||
executableFromShebang :: String -> String
|
executableFromShebang :: String -> String
|
||||||
executableFromShebang = shellFor
|
executableFromShebang = shellFor
|
||||||
where
|
where
|
||||||
shellFor s | "/env " `isInfixOf` s = headOrDefault "" (drop 1 $ words s)
|
shellFor s | "/env " `isInfixOf` s = fromMaybe "" $ do
|
||||||
|
[flag, shell] <- matchRegex re s
|
||||||
|
return shell
|
||||||
shellFor s | ' ' `elem` s = shellFor $ takeWhile (/= ' ') s
|
shellFor s | ' ' `elem` s = shellFor $ takeWhile (/= ' ') s
|
||||||
shellFor s = reverse . takeWhile (/= '/') . reverse $ s
|
shellFor s = reverse . takeWhile (/= '/') . reverse $ s
|
||||||
|
re = mkRegex "/env +(-S|--split-string=?)? *([^ ]*)"
|
||||||
|
|
||||||
|
|
||||||
-- Given a root node, make a map from Id to parent Token.
|
-- Given a root node, make a map from Id to parent Token.
|
||||||
|
|
Loading…
Reference in New Issue