add basic busybox sh support
This commit is contained in:
parent
a71a13c2fc
commit
be8e4b2b8a
|
@ -9,6 +9,7 @@
|
||||||
- SC3015: Warn bashism `test _ =~ _` like in [ ]
|
- SC3015: Warn bashism `test _ =~ _` like in [ ]
|
||||||
- SC3016: Warn bashism `test -v _` like in [ ]
|
- SC3016: Warn bashism `test -v _` like in [ ]
|
||||||
- SC3017: Warn bashism `test -a _` like in [ ]
|
- SC3017: Warn bashism `test -a _` like in [ ]
|
||||||
|
- Added support for busybox sh
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- source statements with here docs now work correctly
|
- source statements with here docs now work correctly
|
||||||
|
|
|
@ -758,8 +758,8 @@ prop_executableFromShebang6 = executableFromShebang "/usr/bin/env --split-string
|
||||||
prop_executableFromShebang7 = executableFromShebang "/usr/bin/env --split-string bash -x" == "bash"
|
prop_executableFromShebang7 = executableFromShebang "/usr/bin/env --split-string bash -x" == "bash"
|
||||||
prop_executableFromShebang8 = executableFromShebang "/usr/bin/env --split-string foo=bar bash -x" == "bash"
|
prop_executableFromShebang8 = executableFromShebang "/usr/bin/env --split-string foo=bar bash -x" == "bash"
|
||||||
prop_executableFromShebang9 = executableFromShebang "/usr/bin/env foo=bar dash" == "dash"
|
prop_executableFromShebang9 = executableFromShebang "/usr/bin/env foo=bar dash" == "dash"
|
||||||
prop_executableFromShebang10 = executableFromShebang "/bin/busybox sh" == "ash"
|
prop_executableFromShebang10 = executableFromShebang "/bin/busybox sh" == "busybox sh"
|
||||||
prop_executableFromShebang11 = executableFromShebang "/bin/busybox ash" == "ash"
|
prop_executableFromShebang11 = executableFromShebang "/bin/busybox ash" == "busybox ash"
|
||||||
|
|
||||||
-- Get the shell executable from a string like '/usr/bin/env bash'
|
-- Get the shell executable from a string like '/usr/bin/env bash'
|
||||||
executableFromShebang :: String -> String
|
executableFromShebang :: String -> String
|
||||||
|
@ -776,7 +776,8 @@ executableFromShebang = shellFor
|
||||||
[x] -> basename x
|
[x] -> basename x
|
||||||
(first:second:args) | basename first == "busybox" ->
|
(first:second:args) | basename first == "busybox" ->
|
||||||
case basename second of
|
case basename second of
|
||||||
"sh" -> "ash" -- busybox sh is ash
|
"sh" -> "busybox sh"
|
||||||
|
"ash" -> "busybox ash"
|
||||||
x -> x
|
x -> x
|
||||||
(first:args) | basename first == "env" ->
|
(first:args) | basename first == "env" ->
|
||||||
fromEnvArgs args
|
fromEnvArgs args
|
||||||
|
|
|
@ -646,10 +646,10 @@ prop_checkShebang9 = verifyNotTree checkShebang "# shellcheck shell=sh\ntrue"
|
||||||
prop_checkShebang10 = verifyNotTree checkShebang "#!foo\n# shellcheck shell=sh ignore=SC2239\ntrue"
|
prop_checkShebang10 = verifyNotTree checkShebang "#!foo\n# shellcheck shell=sh ignore=SC2239\ntrue"
|
||||||
prop_checkShebang11 = verifyTree checkShebang "#!/bin/sh/\ntrue"
|
prop_checkShebang11 = verifyTree checkShebang "#!/bin/sh/\ntrue"
|
||||||
prop_checkShebang12 = verifyTree checkShebang "#!/bin/sh/ -xe\ntrue"
|
prop_checkShebang12 = verifyTree checkShebang "#!/bin/sh/ -xe\ntrue"
|
||||||
prop_checkShebang13 = verifyTree checkShebang "#!/bin/busybox sh"
|
prop_checkShebang13 = verifyNotTree checkShebang "#!/bin/busybox sh"
|
||||||
prop_checkShebang14 = verifyNotTree checkShebang "#!/bin/busybox sh\n# shellcheck shell=sh\n"
|
prop_checkShebang14 = verifyNotTree checkShebang "#!/bin/busybox sh\n# shellcheck shell=sh\n"
|
||||||
prop_checkShebang15 = verifyNotTree checkShebang "#!/bin/busybox sh\n# shellcheck shell=dash\n"
|
prop_checkShebang15 = verifyNotTree checkShebang "#!/bin/busybox sh\n# shellcheck shell=dash\n"
|
||||||
prop_checkShebang16 = verifyTree checkShebang "#!/bin/busybox ash"
|
prop_checkShebang16 = verifyNotTree checkShebang "#!/bin/busybox ash"
|
||||||
prop_checkShebang17 = verifyNotTree checkShebang "#!/bin/busybox ash\n# shellcheck shell=dash\n"
|
prop_checkShebang17 = verifyNotTree checkShebang "#!/bin/busybox ash\n# shellcheck shell=dash\n"
|
||||||
prop_checkShebang18 = verifyNotTree checkShebang "#!/bin/busybox ash\n# shellcheck shell=sh\n"
|
prop_checkShebang18 = verifyNotTree checkShebang "#!/bin/busybox ash\n# shellcheck shell=sh\n"
|
||||||
checkShebang params (T_Annotation _ list t) =
|
checkShebang params (T_Annotation _ list t) =
|
||||||
|
|
|
@ -284,8 +284,8 @@ 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_determineShell9 = determineShellTest "#!/bin/env -S dash -x" == Dash
|
||||||
prop_determineShell10 = determineShellTest "#!/bin/env --split-string= dash -x" == Dash
|
prop_determineShell10 = determineShellTest "#!/bin/env --split-string= dash -x" == Dash
|
||||||
prop_determineShell11 = determineShellTest "#!/bin/busybox sh" == Dash -- busybox sh is a specific shell, not posix sh
|
prop_determineShell11 = determineShellTest "#!/bin/busybox sh" == BusyboxSh -- busybox sh is a specific shell, not posix sh
|
||||||
prop_determineShell12 = determineShellTest "#!/bin/busybox ash" == Dash
|
prop_determineShell12 = determineShellTest "#!/bin/busybox ash" == BusyboxSh
|
||||||
|
|
||||||
determineShellTest = determineShellTest' Nothing
|
determineShellTest = determineShellTest' Nothing
|
||||||
determineShellTest' fallbackShell = determineShell fallbackShell . fromJust . prRoot . pScript
|
determineShellTest' fallbackShell = determineShell fallbackShell . fromJust . prRoot . pScript
|
||||||
|
|
|
@ -156,6 +156,8 @@ shellForExecutable name =
|
||||||
"sh" -> return Sh
|
"sh" -> return Sh
|
||||||
"bash" -> return Bash
|
"bash" -> return Bash
|
||||||
"bats" -> return Bash
|
"bats" -> return Bash
|
||||||
|
"busybox sh" -> return BusyboxSh
|
||||||
|
"busybox ash" -> return BusyboxSh
|
||||||
"dash" -> return Dash
|
"dash" -> return Dash
|
||||||
"ash" -> return Dash -- There's also a warning for this.
|
"ash" -> return Dash -- There's also a warning for this.
|
||||||
"ksh" -> return Ksh
|
"ksh" -> return Ksh
|
||||||
|
|
|
@ -28,7 +28,7 @@ module ShellCheck.Interface
|
||||||
, AnalysisSpec(asScript, asShellType, asFallbackShell, asExecutionMode, asCheckSourced, asTokenPositions, asOptionalChecks)
|
, AnalysisSpec(asScript, asShellType, asFallbackShell, asExecutionMode, asCheckSourced, asTokenPositions, asOptionalChecks)
|
||||||
, AnalysisResult(arComments)
|
, AnalysisResult(arComments)
|
||||||
, FormatterOptions(foColorOption, foWikiLinkCount)
|
, FormatterOptions(foColorOption, foWikiLinkCount)
|
||||||
, Shell(Ksh, Sh, Bash, Dash)
|
, Shell(Ksh, Sh, Bash, Dash, BusyboxSh)
|
||||||
, ExecutionMode(Executed, Sourced)
|
, ExecutionMode(Executed, Sourced)
|
||||||
, ErrorMessage
|
, ErrorMessage
|
||||||
, Code
|
, Code
|
||||||
|
@ -221,7 +221,7 @@ newCheckDescription = CheckDescription {
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Supporting data types
|
-- Supporting data types
|
||||||
data Shell = Ksh | Sh | Bash | Dash deriving (Show, Eq)
|
data Shell = Ksh | Sh | Bash | Dash | BusyboxSh deriving (Show, Eq)
|
||||||
data ExecutionMode = Executed | Sourced deriving (Show, Eq)
|
data ExecutionMode = Executed | Sourced deriving (Show, Eq)
|
||||||
|
|
||||||
type ErrorMessage = String
|
type ErrorMessage = String
|
||||||
|
@ -335,4 +335,3 @@ mockedSystemInterface files = (newSystemInterface :: SystemInterface Identity) {
|
||||||
mockRcFile rcfile mock = mock {
|
mockRcFile rcfile mock = mock {
|
||||||
siGetConfig = const . return $ Just (".shellcheckrc", rcfile)
|
siGetConfig = const . return $ Just (".shellcheckrc", rcfile)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3349,8 +3349,8 @@ readScriptFile sourced = do
|
||||||
verifyShebang pos s = do
|
verifyShebang pos s = do
|
||||||
case isValidShell s of
|
case isValidShell s of
|
||||||
Just True -> return ()
|
Just True -> return ()
|
||||||
Just False -> parseProblemAt pos ErrorC 1071 "ShellCheck only supports sh/bash/dash/ksh scripts. Sorry!"
|
Just False -> parseProblemAt pos ErrorC 1071 "ShellCheck only supports sh/bash/dash/ksh/'busybox sh' scripts. Sorry!"
|
||||||
Nothing -> parseProblemAt pos ErrorC 1008 "This shebang was unrecognized. ShellCheck only supports sh/bash/dash/ksh. Add a 'shell' directive to specify."
|
Nothing -> parseProblemAt pos ErrorC 1008 "This shebang was unrecognized. ShellCheck only supports sh/bash/dash/ksh/'busybox sh'. Add a 'shell' directive to specify."
|
||||||
|
|
||||||
isValidShell s =
|
isValidShell s =
|
||||||
let good = null s || any (`isPrefixOf` s) goodShells
|
let good = null s || any (`isPrefixOf` s) goodShells
|
||||||
|
@ -3366,6 +3366,7 @@ readScriptFile sourced = do
|
||||||
"sh",
|
"sh",
|
||||||
"ash",
|
"ash",
|
||||||
"dash",
|
"dash",
|
||||||
|
"busybox sh",
|
||||||
"bash",
|
"bash",
|
||||||
"bats",
|
"bats",
|
||||||
"ksh"
|
"ksh"
|
||||||
|
|
Loading…
Reference in New Issue