Ubuntu 16.04
バッシュ 4.3.48
shellcheck
ソース ファイルがスクリプトの先頭にある $variablesを表している場合、 が失敗するのはなぜですか?
簡単なスクリプトを次に示します。
#!/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.
$variablesがソース ファイルにあることをshellcheck
知る方法はありますか?
Ubuntu 16.04でこれを機能させるために私がしたことは次のとおりです
@Dash-o は以下の手順を説明しました。
まず、次のように、ソース ファイル宣言の上の行にsource ディレクティブを追加します。
# 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オプションを使用すると、 source ディレクティブの直下で宣言されたソース ファイルshellcheck
に従います。コマンドを実行すると、次のエラーが表示されました。
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
には、Ubuntu 16.04 が提供する最新バージョンである 0.3.7 があったので、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 ...
次に、 -xshellcheck
オプションを指定せずに実行したところ、驚いたことに次のエラーが表示 されました。
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 ...
そのため、 -xshellcheck
オプションを指定せずに最新バージョンに更新すると、コマンド ラインで-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 ディレクティブは実際には必要ないように見えますか、それとも、シャープ記号がすでに 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オプションでエラーなし。Ubuntu 16.04の最新バージョンの単純なシェル スクリプトの先頭にsourcefile ディレクティブが必要ないかどうかを確認するために、 -xオプションなしで実行しました。shellcheck
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...
つまり、ソース ファイルに従っていない場合は、開発者の github ( https://github.com/koalaman/shellcheckshellcheck
) から更新 し、次のように-xオプション を使用して、従うべきソース ファイルがあることを通知します。shellcheck
shellcheck
shellcheck -x script.sh
このサイトが毎日私を助けてくれるので、これが誰かに役立つことを願っています!