Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Annlix
ShellCheck
提交
505ff783
S
ShellCheck
项目概览
Annlix
/
ShellCheck
与 Fork 源项目一致
Fork自
镜像 / koalaman / ShellCheck
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
ShellCheck
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
505ff783
编写于
5月 22, 2017
作者:
V
Vladimir Panteleev
提交者:
koalaman
5月 28, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Recognize bash's `shopt -s lastpipe`
Fixes #732.
上级
ac3f0b33
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
17 addition
and
8 deletion
+17
-8
ShellCheck/Analytics.hs
ShellCheck/Analytics.hs
+3
-2
ShellCheck/AnalyzerLib.hs
ShellCheck/AnalyzerLib.hs
+14
-6
未找到文件。
ShellCheck/Analytics.hs
浏览文件 @
505ff783
...
...
@@ -1521,6 +1521,7 @@ prop_subshellAssignmentCheck15 = verifyNotTree subshellAssignmentCheck "#!/bin/k
prop_subshellAssignmentCheck16
=
verifyNotTree
subshellAssignmentCheck
"(set -e); echo $@"
prop_subshellAssignmentCheck17
=
verifyNotTree
subshellAssignmentCheck
"foo=${ { bar=$(baz); } 2>&1; }; echo $foo $bar"
prop_subshellAssignmentCheck18
=
verifyTree
subshellAssignmentCheck
"( exec {n}>&2; ); echo $n"
prop_subshellAssignmentCheck19
=
verifyNotTree
subshellAssignmentCheck
"#!/bin/bash
\n
shopt -s lastpipe; echo a | read -r b; echo
\"
$b
\"
"
subshellAssignmentCheck
params
t
=
let
flow
=
variableFlow
params
check
=
findSubshelled
flow
[(
"oops"
,
[]
)]
Map
.
empty
...
...
@@ -2105,7 +2106,7 @@ checkLoopKeywordScope params t |
where
name
=
getCommandName
t
path
=
let
p
=
getPath
(
parentMap
params
)
t
in
filter
relevant
p
subshellType
t
=
case
leadType
(
shellType
params
)
(
parentMap
params
)
t
of
subshellType
t
'
=
case
leadType
(
shellType
params
)
(
parentMap
params
)
t'
t
of
NoneScope
->
Nothing
SubshellScope
str
->
return
str
relevant
t
=
isLoop
t
||
isFunction
t
||
isJust
(
subshellType
t
)
...
...
@@ -2167,7 +2168,7 @@ checkUnpassedInFunctions params root =
functions
=
execWriter
$
doAnalysis
(
tell
.
maybeToList
.
findFunction
)
root
findFunction
t
@
(
T_Function
id
_
_
name
body
)
=
let
flow
=
getVariableFlow
(
shellType
params
)
(
parentMap
params
)
body
let
flow
=
getVariableFlow
(
shellType
params
)
(
parentMap
params
)
body
root
in
if
any
(
isPositionalReference
t
)
flow
&&
not
(
any
isPositionalAssignment
flow
)
then
return
t
...
...
ShellCheck/AnalyzerLib.hs
浏览文件 @
505ff783
...
...
@@ -145,7 +145,7 @@ makeParameters spec =
shellTypeSpecified
=
isJust
$
asShellType
spec
,
parentMap
=
getParentTree
root
,
variableFlow
=
getVariableFlow
(
shellType
params
)
(
parentMap
params
)
root
getVariableFlow
(
shellType
params
)
(
parentMap
params
)
root
root
}
in
params
where
root
=
asScript
spec
...
...
@@ -337,18 +337,18 @@ tokenIsJustCommandOutput t = case t of
check
_
=
False
-- TODO: Replace this with a proper Control Flow Graph
getVariableFlow
shell
parents
t
=
getVariableFlow
shell
parents
t
root
=
let
(
_
,
stack
)
=
runState
(
doStackAnalysis
startScope
endScope
t
)
[]
in
reverse
stack
where
startScope
t
=
let
scopeType
=
leadType
shell
parents
t
let
scopeType
=
leadType
shell
parents
t
root
in
do
when
(
scopeType
/=
NoneScope
)
$
modify
(
StackScope
scopeType
:
)
when
(
assignFirst
t
)
$
setWritten
t
endScope
t
=
let
scopeType
=
leadType
shell
parents
t
let
scopeType
=
leadType
shell
parents
t
root
in
do
setRead
t
unless
(
assignFirst
t
)
$
setWritten
t
...
...
@@ -367,7 +367,7 @@ getVariableFlow shell parents t =
in
mapM_
(
\
v
->
modify
(
Assignment
v
:
))
written
leadType
shell
parents
t
=
leadType
shell
parents
t
root
=
case
t
of
T_DollarExpansion
_
_
->
SubshellScope
"$(..) expansion"
T_Backticked
_
_
->
SubshellScope
"`..` expansion"
...
...
@@ -396,11 +396,19 @@ leadType shell parents t =
lastCreatesSubshell
=
case
shell
of
Bash
->
Tru
e
Bash
->
not
hasShoptLastPip
e
Dash
->
True
Sh
->
True
Ksh
->
False
hasShoptLastPipe
=
isNothing
$
doAnalysis
(
guard
.
not
.
isShoptLastPipe
)
root
isShoptLastPipe
t
=
case
t
of
T_SimpleCommand
{}
->
t
`
isUnqualifiedCommand
`
"shopt"
&&
(
"lastpipe"
`
elem
`
oversimplify
t
)
_
->
False
getModifiedVariables
t
=
case
t
of
T_SimpleCommand
_
vars
[]
->
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录