Почему не проходит проверка оболочки, когда исходный файл представляет переменные в верхней части скрипта? - PullRequest
0 голосов
/ 28 октября 2019

Ubuntu 16.04
Bash 4.3.48

Почему происходит сбой shellcheck, когда исходный файл представляет переменные в верхней части скрипта?

Вот простой скрипт:

#!/bin/bash

. .sourcefile

echo "Today is ${day}."

Вот мой исходный файл:

day="Monday"

Вот ответы shellcheck "

root@0000 /home/.work # 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, мне пришлось добавить директиву source в строку перед моим выражением source:

#!/bin/bash

# shellcheck source=./.sourcefile.sh
. .sourcefile.sh

echo "Today is ${day}."

и добавить -x в командную строку, чтобы shellcheck следовал зафайл. Когда я превысил команду, я получил следующую ошибку:

root@0000 /home/.work # 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

Байу упомянул, что ему нужна более новая версия. Я проверил, и я запустил 0.3.7, и это была последняя версия, которую Ubuntu должен был предложить для16.04. Я взял последний двоичный файл от разработчиков и установил его.

root@0000 /home/.work # mkdir /home/.remove
root@0000 /home/.work # cd /usr/bin
root@0000 /usr/bin # mv shellcheck /home/.remove
root@0000 /usr/bin # wget https://storage.googleapis.com/shellcheck/shellcheck-stable.linux.x86_64.tar.xz

2019-10-28 12:36:20 (14.0 MB/s) - ‘shellcheck-stable.linux.x86_64.tar.xz’ saved [1545012/1545012]

root@0000 /usr/bin # tar xvf shellcheck-stable.linux.x86_64.tar.xz

shellcheck-stable/README.txt
shellcheck-stable/LICENSE.txt
shellcheck-stable/shellcheck

root@0000 /usr/bin # mv shellcheck-stable.linux.x86_64.tar.xz /home/.remove
root@0000 /usr/bin # mv shellcheck-stable/shellcheck .
root@0000 /usr/bin # mv shellcheck-stable /home/.remove
root@0000 /usr/bin # rm -rf /home/.remove

Я выполнил команду shellcheck -x start.sh, и я получил ноль ошибок. Затем я заставил shellcheck выдать предупреждение, добавив cat $alkjcvkljdvksldjbдо конца моего сценария и все работало как положено.

root@0000 /home/.work # shellcheck -x start.sh
root@0000 /home/.work # echo "cat \$alkjcvkljdvksldjb" >> start.sh
root@0000 /home/.work # shellcheck -x start.sh

In start.sh line 7:
cat $alkjcvkljdvksldjb
    ^----------------^ SC2154: alkjcvkljdvksldjb is referenced but not assigned.
    ^----------------^ SC2086: Double quote to prevent globbing and word splitting.

Did you mean:
cat "$alkjcvkljdvksldjb"

For more information:
  https://www.shellcheck.net/wiki/SC2154 -- alkjcvkljdvksldjb is referenced b...
  https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...

Надеюсьэто помогает кому-то.

Ответы [ 2 ]

3 голосов
/ 28 октября 2019

Проверка орфографии - инструмент статического анализа. Он не обрабатывает динамический путь (на основе переменных или выражений). В качестве альтернативы рассмотрите возможность добавления директивы source.

Пример:

# shellcheck source=./lib.sh
source "$(find_install_dir)/lib.sh"

Директива source = сообщает spellcheck местоположение динамически генерируемого имени файла. Исходя из вопроса, это должно быть (наиболее вероятно, относительное) местоположение .sourcefile.

, задокументированное в https://github.com/koalaman/shellcheck/blob/master/shellcheck.1.md

1 голос
/ 28 октября 2019

Я использую shellcheck 0.4.4, и он также говорит:

В строке start.sh 2:. "$ (pwd)" /. sourcefile
^ - SC1090: Невозможно следить за непостоянным источником. Используйте директиву для указания местоположения.

Это означает, что вам придется использовать абсолютные пути, но более новые версии могут поддерживать -P.

Если выпереключился на непостоянный источник, он не будет работать так же, потому что .sourcefile нужен шебанг, и вы должны добавить этот файл с -x следующим образом:

shellcheck -x .sourcefile start.sh

Он все равно будет жаловаться на:

day = "Monday"
^ - SC2034: день не используется. Проверьте это или экспортируйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...