当源文件代表脚本顶部的变量时,为什么 shellcheck 会失败?
Why does shellcheck fail when a source file is representing the variables at the top of a script?
Ubuntu 16.04
Bash4.3.48
当源文件代表脚本顶部的 $variables 时,为什么 shellcheck
会失败?
这是一个简单的脚本:
#!/bin/bash
. .sourcefile
echo "Today is ${day}."
这是我的源文件:
day="Monday"
这是来自 shellcheck
的回复:
me@myserver:~$ shellcheck start.sh
In start.sh line 5:
echo "Today is ${day}."
^-- SC2154: day is referenced but not assigned.
有没有办法让shellcheck
知道$变量在源文件中?
这是我在 Ubuntu 16.04
上所做的工作
@Dash-o 解释了以下过程:
首先,在源文件声明上方的行中添加源指令,如下所示:
# shellcheck source=/path/to/sourcefile
#!/bin/bash
# shellcheck source=./.sourcefile
. .sourcefile
echo "Today is ${day}."
接下来,在脚本之前使用 -x 选项执行 shellcheck
,如下所示:
shellcheck -x start.sh
me@myserver:~$ shellcheck -x start.sh
当使用 -x 选项时,shellcheck
将跟随直接在 [=97= 下方声明的 源文件 ]源指令。当我执行命令时,收到以下错误:
me@myserver:~$ shellcheck -x start.sh
unrecognized option `-x'
Usage: shellcheck [OPTIONS...] FILES...
-e CODE1,CODE2.. --exclude=CODE1,CODE2.. exclude types of warnings
-f FORMAT --format=FORMAT output format
-s SHELLNAME --shell=SHELLNAME Specify dialect (bash,sh,ksh)
-V --version Print version information
@Bayou 提到我的 OS 需要更新版本的 shellcheck
。我检查了我的 Ubuntu 16.04 安装。我的服务器有 shellcheck
0.3.7,这是 Ubuntu 16.04 必须提供的最新版本,所以我从 shellcheck
开发人员那里获取了最新的二进制文件并安装了它。
me@myserver:~$ mkdir .work && cd .work
me@myserver:~/.work$ wget -q https://github.com/koalaman/shellcheck/releases/download/stable/shellcheck-stable.linux.x86_64.tar.xz
me@myserver:~/.work$ ls
shellcheck-stable.linux.x86_64.tar.xz
me@myserver:~/.work$ tar xvf shellcheck-stable.linux.x86_64.tar.xz
shellcheck-stable/README.txt
shellcheck-stable/LICENSE.txt
shellcheck-stable/shellcheck
me@myserver:~/.work$ sudo chown root: shellcheck-stable/shellcheck
me@myserver:~/.work$ sudo mv /usr/bin/shellcheck .
me@myserver:~/.work$ sudo mv shellcheck-stable/shellcheck /usr/bin/
me@myserver:~/.work$ cd ../
me@myserver:~$ rm -rf .work/
me@myserver:~$ shellcheck -V
ShellCheck - shell script analysis tool
version: 0.7.1
license: GNU General Public License, version 3
website: https://www.shellcheck.net
我 运行 命令 shellcheck -x start.sh
我收到零错误。
me@myserver:~$ shellcheck -x start.sh
然后我强迫shellcheck
给我一些错误。我在脚本末尾添加了 cat $myVariable
。
me@myserver:~$ echo "cat $myVariable" >> start.sh
me@myserver:~$ cat start.sh
#!/bin/bash
# shellcheck source=./.sourcefile
. .sourcefile
echo "Today is ${day}."
cat $myVariable
我测试了我的理论,shellcheck
按照我的 源文件 给出了我预期的错误。
me@myserver:~$ shellcheck -x start.sh
In start.sh line 7:
cat $myVariable
^---------^ SC2154: myVariable is referenced but not assigned.
^---------^ SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
cat "$myVariable"
For more information:
https://www.shellcheck.net/wiki/SC2154 -- myVariable is referenced but not ...
https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
然后我在没有 -x 选项的情况下执行 shellcheck
并且令我惊讶的是我收到了以下错误:
me@myserver:~$ shellcheck start.sh
In start.sh line 4:
. .sourcefile
^---------^ SC1091: Not following: ./.sourcefile was not specified as input (see shellcheck -x).
In start.sh line 6:
echo "Today is ${day}."
^----^ SC2154: day is referenced but not assigned.
In start.sh line 7:
cat $myVariable
^---------^ SC2154: myVariable is referenced but not assigned.
^---------^ SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
cat "$myVariable"
For more information:
https://www.shellcheck.net/wiki/SC2154 -- day is referenced but not assigned.
https://www.shellcheck.net/wiki/SC1091 -- Not following: ./.sourcefile was ...
https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
所以 shellcheck
更新到最新版本并且没有 -x 选项,也会给你一个关于你错过 -x 的错误 命令行选项。所以我决定在 start.sh
中注释掉 sourcefile 指令
me@myserver:~$ sed -i '3s/./#\ &/' start.sh
me@myserver:~$ cat start.sh
#!/bin/bash
# # shellcheck source=./.sourcefile
. .sourcefile
echo "Today is ${day}."
cat $myVariable
现在看看 shellcheck
怎么想
me@myserver:~$ shellcheck -x start.sh
In start.sh line 7:
cat $myVariable
^---------^ SC2154: myVariable is referenced but not assigned.
^---------^ SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
cat "$myVariable"
For more information:
https://www.shellcheck.net/wiki/SC2154 -- myVariable is referenced but not ...
https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
哇啊啊啊?因此,我的简单脚本似乎确实不需要 sourcefile 指令,或者 shellcheck 仍然看到 sourcefile 指令 被注释掉了以数字符号作为数字符号已经开始源文件指令?因此,我完全删除了 sourcefile 指令 并注释掉了最后一行,该行引用了未在源文件中分配的 myVariable 变量。
me@myserver:~$ sed -i '3d' start.sh
me@myserver:~$ sed -i '$d' start.sh
me@myserver:~$ cat start.sh
#!/bin/bash
. .sourcefile
echo "Today is ${day}."
现在看看 shellcheck
报告的内容:
me@myserver:~$ shellcheck -x start.sh
-x 选项没有错误。现在检查 sourcefile 指令 是否不需要在一个简单的 shell 脚本的顶部,在 Ubuntu 16.04 上有最新版本的 shellcheck
,我在没有 -x 选项的情况下执行 shellcheck
。
me@myserver:~$ shellcheck start.sh
In start.sh line 3:
. .sourcefile
^---------^ SC1091: Not following: .sourcefile was not specified as input (see shellcheck -x).
In start.sh line 5:
echo "Today is ${day}."
^----^ SC2154: day is referenced but not assigned.
For more information:
https://www.shellcheck.net/wiki/SC2154 -- day is referenced but not assigned.
https://www.shellcheck.net/wiki/SC1091 -- Not following: .sourcefile was no...
所以,简而言之,如果 shellcheck
没有遵循您的源文件,请从开发人员的 github - (https://github.com/koalaman/shellcheck) 更新 shellcheck
并通知 shellcheck
使用 -x 选项可以跟随一个源文件,如下所示:
shellcheck -x script.sh
我希望这对某人有所帮助,因为这个网站每天都在帮助我!
我使用 shellcheck 0.4.4,它还说:
In start.sh line 2:
. "$(pwd)"/.sourcefile
^-- SC1090: Can't follow non-constant source. Use a directive to specify location.
这意味着您必须使用绝对路径,但 newer 版本可能支持 -P
。
如果您切换到非常量源,它将无法正常工作,因为 .sourcefile
需要一个 shebang,您必须使用 -x
添加此文件:
shellcheck -x .sourcefile start.sh
它仍然会抱怨:
day="Monday"
^-- SC2034: day appears unused. Verify it or export it.
Shellcheck 是一种静态分析工具。它不处理动态路径(基于变量或表达式)。作为替代方案,请考虑添加 source 指令。
示例:
# shellcheck source=./lib.sh
source "$(find_install_dir)/lib.sh"
source= 指令告诉 shellcheck 动态生成的文件名的位置。从问题来看,这应该是 .sourcefile
.
的(最有可能的,相对的)位置
记录在 https://github.com/koalaman/shellcheck/blob/master/shellcheck.1.md
Ubuntu 16.04
Bash4.3.48
当源文件代表脚本顶部的 $variables 时,为什么 shellcheck
会失败?
这是一个简单的脚本:
#!/bin/bash
. .sourcefile
echo "Today is ${day}."
这是我的源文件:
day="Monday"
这是来自 shellcheck
的回复:
me@myserver:~$ shellcheck start.sh
In start.sh line 5:
echo "Today is ${day}."
^-- SC2154: day is referenced but not assigned.
有没有办法让shellcheck
知道$变量在源文件中?
这是我在 Ubuntu 16.04
上所做的工作@Dash-o 解释了以下过程:
首先,在源文件声明上方的行中添加源指令,如下所示:
# shellcheck source=/path/to/sourcefile
#!/bin/bash
# shellcheck source=./.sourcefile
. .sourcefile
echo "Today is ${day}."
接下来,在脚本之前使用 -x 选项执行 shellcheck
,如下所示:
shellcheck -x start.sh
me@myserver:~$ shellcheck -x start.sh
当使用 -x 选项时,shellcheck
将跟随直接在 [=97= 下方声明的 源文件 ]源指令。当我执行命令时,收到以下错误:
me@myserver:~$ shellcheck -x start.sh
unrecognized option `-x'
Usage: shellcheck [OPTIONS...] FILES...
-e CODE1,CODE2.. --exclude=CODE1,CODE2.. exclude types of warnings
-f FORMAT --format=FORMAT output format
-s SHELLNAME --shell=SHELLNAME Specify dialect (bash,sh,ksh)
-V --version Print version information
@Bayou 提到我的 OS 需要更新版本的 shellcheck
。我检查了我的 Ubuntu 16.04 安装。我的服务器有 shellcheck
0.3.7,这是 Ubuntu 16.04 必须提供的最新版本,所以我从 shellcheck
开发人员那里获取了最新的二进制文件并安装了它。
me@myserver:~$ mkdir .work && cd .work
me@myserver:~/.work$ wget -q https://github.com/koalaman/shellcheck/releases/download/stable/shellcheck-stable.linux.x86_64.tar.xz
me@myserver:~/.work$ ls
shellcheck-stable.linux.x86_64.tar.xz
me@myserver:~/.work$ tar xvf shellcheck-stable.linux.x86_64.tar.xz
shellcheck-stable/README.txt
shellcheck-stable/LICENSE.txt
shellcheck-stable/shellcheck
me@myserver:~/.work$ sudo chown root: shellcheck-stable/shellcheck
me@myserver:~/.work$ sudo mv /usr/bin/shellcheck .
me@myserver:~/.work$ sudo mv shellcheck-stable/shellcheck /usr/bin/
me@myserver:~/.work$ cd ../
me@myserver:~$ rm -rf .work/
me@myserver:~$ shellcheck -V
ShellCheck - shell script analysis tool
version: 0.7.1
license: GNU General Public License, version 3
website: https://www.shellcheck.net
我 运行 命令 shellcheck -x start.sh
我收到零错误。
me@myserver:~$ shellcheck -x start.sh
然后我强迫shellcheck
给我一些错误。我在脚本末尾添加了 cat $myVariable
。
me@myserver:~$ echo "cat $myVariable" >> start.sh
me@myserver:~$ cat start.sh
#!/bin/bash
# shellcheck source=./.sourcefile
. .sourcefile
echo "Today is ${day}."
cat $myVariable
我测试了我的理论,shellcheck
按照我的 源文件 给出了我预期的错误。
me@myserver:~$ shellcheck -x start.sh
In start.sh line 7:
cat $myVariable
^---------^ SC2154: myVariable is referenced but not assigned.
^---------^ SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
cat "$myVariable"
For more information:
https://www.shellcheck.net/wiki/SC2154 -- myVariable is referenced but not ...
https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
然后我在没有 -x 选项的情况下执行 shellcheck
并且令我惊讶的是我收到了以下错误:
me@myserver:~$ shellcheck start.sh
In start.sh line 4:
. .sourcefile
^---------^ SC1091: Not following: ./.sourcefile was not specified as input (see shellcheck -x).
In start.sh line 6:
echo "Today is ${day}."
^----^ SC2154: day is referenced but not assigned.
In start.sh line 7:
cat $myVariable
^---------^ SC2154: myVariable is referenced but not assigned.
^---------^ SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
cat "$myVariable"
For more information:
https://www.shellcheck.net/wiki/SC2154 -- day is referenced but not assigned.
https://www.shellcheck.net/wiki/SC1091 -- Not following: ./.sourcefile was ...
https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
所以 shellcheck
更新到最新版本并且没有 -x 选项,也会给你一个关于你错过 -x 的错误 命令行选项。所以我决定在 start.sh
me@myserver:~$ sed -i '3s/./#\ &/' start.sh
me@myserver:~$ cat start.sh
#!/bin/bash
# # shellcheck source=./.sourcefile
. .sourcefile
echo "Today is ${day}."
cat $myVariable
现在看看 shellcheck
怎么想
me@myserver:~$ shellcheck -x start.sh
In start.sh line 7:
cat $myVariable
^---------^ SC2154: myVariable is referenced but not assigned.
^---------^ SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
cat "$myVariable"
For more information:
https://www.shellcheck.net/wiki/SC2154 -- myVariable is referenced but not ...
https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
哇啊啊啊?因此,我的简单脚本似乎确实不需要 sourcefile 指令,或者 shellcheck 仍然看到 sourcefile 指令 被注释掉了以数字符号作为数字符号已经开始源文件指令?因此,我完全删除了 sourcefile 指令 并注释掉了最后一行,该行引用了未在源文件中分配的 myVariable 变量。
me@myserver:~$ sed -i '3d' start.sh
me@myserver:~$ sed -i '$d' start.sh
me@myserver:~$ cat start.sh
#!/bin/bash
. .sourcefile
echo "Today is ${day}."
现在看看 shellcheck
报告的内容:
me@myserver:~$ shellcheck -x start.sh
-x 选项没有错误。现在检查 sourcefile 指令 是否不需要在一个简单的 shell 脚本的顶部,在 Ubuntu 16.04 上有最新版本的 shellcheck
,我在没有 -x 选项的情况下执行 shellcheck
。
me@myserver:~$ shellcheck start.sh
In start.sh line 3:
. .sourcefile
^---------^ SC1091: Not following: .sourcefile was not specified as input (see shellcheck -x).
In start.sh line 5:
echo "Today is ${day}."
^----^ SC2154: day is referenced but not assigned.
For more information:
https://www.shellcheck.net/wiki/SC2154 -- day is referenced but not assigned.
https://www.shellcheck.net/wiki/SC1091 -- Not following: .sourcefile was no...
所以,简而言之,如果 shellcheck
没有遵循您的源文件,请从开发人员的 github - (https://github.com/koalaman/shellcheck) 更新 shellcheck
并通知 shellcheck
使用 -x 选项可以跟随一个源文件,如下所示:
shellcheck -x script.sh
我希望这对某人有所帮助,因为这个网站每天都在帮助我!
我使用 shellcheck 0.4.4,它还说:
In start.sh line 2: . "$(pwd)"/.sourcefile
^-- SC1090: Can't follow non-constant source. Use a directive to specify location.
这意味着您必须使用绝对路径,但 newer 版本可能支持 -P
。
如果您切换到非常量源,它将无法正常工作,因为 .sourcefile
需要一个 shebang,您必须使用 -x
添加此文件:
shellcheck -x .sourcefile start.sh
它仍然会抱怨:
day="Monday"
^-- SC2034: day appears unused. Verify it or export it.
Shellcheck 是一种静态分析工具。它不处理动态路径(基于变量或表达式)。作为替代方案,请考虑添加 source 指令。
示例:
# shellcheck source=./lib.sh
source "$(find_install_dir)/lib.sh"
source= 指令告诉 shellcheck 动态生成的文件名的位置。从问题来看,这应该是 .sourcefile
.
记录在 https://github.com/koalaman/shellcheck/blob/master/shellcheck.1.md