17

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オプションなしで実行しました。shellcheckshellcheck

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オプション を使用して、従うべきソース ファイルがあることを通知します。shellcheckshellcheck

shellcheck -x script.sh  

このサイトが毎日私を助けてくれるので、これが誰かに役立つことを願っています!

4

2 に答える 2