A fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.
This project has several shell scripts. Those should be tested with shellcheck.
Motivation
Shell scripts are used in this project for 2 primary purposes:
building/testing in CI
building interactively
e.g., build-python.sh is a public, user-facing API into building the Python package
Checking those scripts with static analyzers would help to reduce the risk of mistakes being silently missed. It'd also give us a chance of catching issues in code paths that aren't covered by CI.
It is not necessary to fix all of the problems in a single pull request.
To work on this, add the shellcheck-py config linked in the docs above, then run this:
pre-commit run --all-files
That'll generate a list of errors. Put up a pull request that fixes some of them, and explain in the PR description exactly which errors it fixes.
As of this writing, that check returned the following:
full list of errors (click me)
```text
In .ci/check_python_dists.sh line 3:
set -e -E -u
^-- SC3041 (warning): In POSIX sh, set flag -E is undefined.
In .ci/check_python_dists.sh line 19:
twine check --strict ${DIST_DIR}/* || exit 1
^---------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
twine check --strict "${DIST_DIR}"/* || exit 1
In .ci/check_python_dists.sh line 23:
check-wheel-contents ${DIST_DIR}/*.whl || exit 1
^---------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
check-wheel-contents "${DIST_DIR}"/*.whl || exit 1
In .ci/check_python_dists.sh line 27:
if [ $PY_MINOR_VER -gt 7 ]; then
^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
if [ "$PY_MINOR_VER" -gt 7 ]; then
In .ci/check_python_dists.sh line 37:
${DIST_DIR}/* || exit 1
^---------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
"${DIST_DIR}"/* || exit 1
In .ci/check_python_dists.sh line 38:
elif { test $(uname -m) = "aarch64"; }; then
^---------^ SC2046 (warning): Quote this to prevent word splitting.
In .ci/check_python_dists.sh line 45:
${DIST_DIR}/* || exit 1
^---------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
"${DIST_DIR}"/* || exit 1
In .ci/check_python_dists.sh line 52:
${DIST_DIR}/* || exit 1
^---------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
"${DIST_DIR}"/* || exit 1
In .ci/install-clang-devel.sh line 35:
clang-${CLANG_VERSION} \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
clang-"${CLANG_VERSION}" \
In .ci/install-clang-devel.sh line 36:
clangd-${CLANG_VERSION} \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
clangd-"${CLANG_VERSION}" \
In .ci/install-clang-devel.sh line 37:
clang-format-${CLANG_VERSION} \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
clang-format-"${CLANG_VERSION}" \
In .ci/install-clang-devel.sh line 38:
clang-tidy-${CLANG_VERSION} \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
clang-tidy-"${CLANG_VERSION}" \
In .ci/install-clang-devel.sh line 39:
clang-tools-${CLANG_VERSION} \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
clang-tools-"${CLANG_VERSION}" \
In .ci/install-clang-devel.sh line 40:
lldb-${CLANG_VERSION} \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
lldb-"${CLANG_VERSION}" \
In .ci/install-clang-devel.sh line 41:
lld-${CLANG_VERSION} \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
lld-"${CLANG_VERSION}" \
In .ci/install-clang-devel.sh line 42:
llvm-${CLANG_VERSION}-dev \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
llvm-"${CLANG_VERSION}"-dev \
In .ci/install-clang-devel.sh line 43:
llvm-${CLANG_VERSION}-tools \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
llvm-"${CLANG_VERSION}"-tools \
In .ci/install-clang-devel.sh line 44:
libomp-${CLANG_VERSION}-dev \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
libomp-"${CLANG_VERSION}"-dev \
In .ci/install-clang-devel.sh line 45:
libc++-${CLANG_VERSION}-dev \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
libc++-"${CLANG_VERSION}"-dev \
In .ci/install-clang-devel.sh line 46:
libc++abi-${CLANG_VERSION}-dev \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
libc++abi-"${CLANG_VERSION}"-dev \
In .ci/install-clang-devel.sh line 47:
libclang-common-${CLANG_VERSION}-dev \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
libclang-common-"${CLANG_VERSION}"-dev \
In .ci/install-clang-devel.sh line 48:
libclang-${CLANG_VERSION}-dev \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
libclang-"${CLANG_VERSION}"-dev \
In .ci/install-clang-devel.sh line 49:
libclang-cpp${CLANG_VERSION}-dev \
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
libclang-cpp"${CLANG_VERSION}"-dev \
In .ci/install-clang-devel.sh line 50:
libunwind-${CLANG_VERSION}-dev
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
libunwind-"${CLANG_VERSION}"-dev
In .ci/install-clang-devel.sh line 54:
cp --remove-destination /usr/lib/llvm-${CLANG_VERSION}/bin/* /usr/bin/
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cp --remove-destination /usr/lib/llvm-"${CLANG_VERSION}"/bin/* /usr/bin/
In .ci/lint-cpp.sh line 20:
${cmake_files} \
^------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
"${cmake_files}" \
In .ci/rerun_workflow.sh line 38:
runs=$(echo $runs | jq --arg pr_number "$pr_number" --arg pr_branch "$pr_branch" 'map(select(.event == "pull_request" and ((.pull_requests | length) != 0 and (.pull_requests[0].number | tostring) == $pr_number or .head_branch == $pr_branch)))')
^---^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
runs=$(echo "$runs" | jq --arg pr_number "$pr_number" --arg pr_branch "$pr_branch" 'map(select(.event == "pull_request" and ((.pull_requests | length) != 0 and (.pull_requests[0].number | tostring) == $pr_number or .head_branch == $pr_branch)))')
In .ci/rerun_workflow.sh line 39:
runs=$(echo $runs | jq 'sort_by(.run_number) | reverse')
^---^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
runs=$(echo "$runs" | jq 'sort_by(.run_number) | reverse')
In .ci/rerun_workflow.sh line 41:
if [[ $(echo $runs | jq 'length') -gt 0 ]]; then
^---^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
if [[ $(echo "$runs" | jq 'length') -gt 0 ]]; then
In .ci/rerun_workflow.sh line 46:
"${GITHUB_API_URL}/repos/microsoft/LightGBM/actions/runs/$(echo $runs | jq '.[0].id')/rerun"
^---^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
"${GITHUB_API_URL}/repos/microsoft/LightGBM/actions/runs/$(echo "$runs" | jq '.[0].id')/rerun"
In .ci/set_commit_status.sh line 42:
--arg state $status \
^-----^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
--arg state "$status" \
In .ci/setup.sh line 143:
https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-${ARCH}.sh
^------^ SC2046 (warning): Quote this to prevent word splitting.
^-----^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-"${ARCH}".sh
In .ci/setup.sh line 144:
sh miniforge.sh -b -p $CONDA
^----^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
sh miniforge.sh -b -p "$CONDA"
In .ci/test.sh line 59:
cmake -B build -S . -DBUILD_CPP_TEST=ON -DUSE_OPENMP=OFF -DUSE_DEBUG=ON $extra_cmake_opts
^---------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cmake -B build -S . -DBUILD_CPP_TEST=ON -DUSE_OPENMP=OFF -DUSE_DEBUG=ON "$extra_cmake_opts"
In .ci/test.sh line 66:
CONDA_PYTHON_REQUIREMENT="python=$PYTHON_VERSION[build=*cpython]"
^-- SC1087 (error): Use braces when expanding arrays, e.g. ${array[idx]} (or ${var}[.. to quiet).
In .ci/test.sh line 69:
mamba create -q -y -n $CONDA_ENV ${CONDA_PYTHON_REQUIREMENT} numpy
^-------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
mamba create -q -y -n $CONDA_ENV "${CONDA_PYTHON_REQUIREMENT}" numpy
In .ci/test.sh line 70:
source activate $CONDA_ENV
^------^ SC1091 (info): Not following: activate was not specified as input (see shellcheck -x).
In .ci/test.sh line 92:
cp ./build/lightgbmlib.jar $BUILD_ARTIFACTSTAGINGDIRECTORY/lightgbmlib_$OS_NAME.jar
^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cp ./build/lightgbmlib.jar "$BUILD_ARTIFACTSTAGINGDIRECTORY"/lightgbmlib_"$OS_NAME".jar
In .ci/test.sh line 99:
${CONDA_PYTHON_REQUIREMENT} \
^-------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
"${CONDA_PYTHON_REQUIREMENT}" \
In .ci/test.sh line 107:
source activate $CONDA_ENV
^------^ SC1091 (info): Not following: activate was not specified as input (see shellcheck -x).
In .ci/test.sh line 128:
source activate $CONDA_ENV
^------^ SC1091 (info): Not following: activate was not specified as input (see shellcheck -x).
In .ci/test.sh line 131:
rstcheck --report-level warning $(find . -type f -name "*.rst") || exit 1
^-----------------------------^ SC2046 (warning): Quote this to prevent word splitting.
In .ci/test.sh line 133:
rstcheck --report-level warning --ignore-directives=autoclass,autofunction,autosummary,doxygenfile $(find . -type f -name "*.rst") || exit 1
^-----------------------------^ SC2046 (warning): Quote this to prevent word splitting.
In .ci/test.sh line 163:
${CONDA_REQUIREMENT_FILES} \
^------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
"${CONDA_REQUIREMENT_FILES}" \
In .ci/test.sh line 164:
${CONDA_PYTHON_REQUIREMENT} \
^-------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
"${CONDA_PYTHON_REQUIREMENT}" \
In .ci/test.sh line 167:
source activate $CONDA_ENV
^------^ SC1091 (info): Not following: activate was not specified as input (see shellcheck -x).
In .ci/test.sh line 173:
for LIBOMP_ALIAS in libgomp.dylib libiomp5.dylib libomp.dylib; do sudo ln -sf "$(brew --cellar libomp)"/*/lib/libomp.dylib $CONDA_PREFIX/lib/$LIBOMP_ALIAS || exit 1; done
^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
for LIBOMP_ALIAS in libgomp.dylib libiomp5.dylib libomp.dylib; do sudo ln -sf "$(brew --cellar libomp)"/*/lib/libomp.dylib "$CONDA_PREFIX"/lib/$LIBOMP_ALIAS || exit 1; done
In .ci/test.sh line 179:
pip install ./dist/lightgbm-$LGB_VER.tar.gz -v || exit 1
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
pip install ./dist/lightgbm-"$LGB_VER".tar.gz -v || exit 1
In .ci/test.sh line 181:
cp ./dist/lightgbm-$LGB_VER.tar.gz $BUILD_ARTIFACTSTAGINGDIRECTORY || exit 1
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cp ./dist/lightgbm-"$LGB_VER".tar.gz "$BUILD_ARTIFACTSTAGINGDIRECTORY" || exit 1
In .ci/test.sh line 190:
cp dist/lightgbm-$LGB_VER-py3-none-macosx*.whl $BUILD_ARTIFACTSTAGINGDIRECTORY || exit 1
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cp dist/lightgbm-"$LGB_VER"-py3-none-macosx*.whl "$BUILD_ARTIFACTSTAGINGDIRECTORY" || exit 1
In .ci/test.sh line 204:
./dist/lightgbm-$LGB_VER-py3-none-$PLATFORM.whl || exit 1
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
^-------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
./dist/lightgbm-"$LGB_VER"-py3-none-"$PLATFORM".whl || exit 1
In .ci/test.sh line 207:
cp dist/lightgbm-$LGB_VER-py3-none-$PLATFORM.whl $BUILD_ARTIFACTSTAGINGDIRECTORY || exit 1
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
^-------^ SC2086 (info): Double quote to prevent globbing and word splitting.
^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cp dist/lightgbm-"$LGB_VER"-py3-none-"$PLATFORM".whl "$BUILD_ARTIFACTSTAGINGDIRECTORY" || exit 1
In .ci/test.sh line 226:
./dist/lightgbm-$LGB_VER.tar.gz \
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
./dist/lightgbm-"$LGB_VER".tar.gz \
In .ci/test.sh line 233:
pip install ./dist/lightgbm-$LGB_VER*.whl -v || exit 1
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
pip install ./dist/lightgbm-"$LGB_VER"*.whl -v || exit 1
In .ci/test.sh line 251:
./dist/lightgbm-$LGB_VER.tar.gz \
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
./dist/lightgbm-"$LGB_VER".tar.gz \
In .ci/test.sh line 258:
pip install ./dist/lightgbm-$LGB_VER*.whl -v || exit 1
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
pip install ./dist/lightgbm-"$LGB_VER"*.whl -v || exit 1
In .ci/test.sh line 271:
./dist/lightgbm-$LGB_VER.tar.gz \
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
./dist/lightgbm-"$LGB_VER".tar.gz \
In .ci/test.sh line 278:
pip install ./dist/lightgbm-$LGB_VER*.whl -v || exit 1
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
pip install ./dist/lightgbm-"$LGB_VER"*.whl -v || exit 1
In .ci/test.sh line 296:
cp ./lib_lightgbm.dylib $BUILD_ARTIFACTSTAGINGDIRECTORY/lib_lightgbm.dylib
^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cp ./lib_lightgbm.dylib "$BUILD_ARTIFACTSTAGINGDIRECTORY"/lib_lightgbm.dylib
In .ci/test.sh line 302:
cp ./lib_lightgbm.so $BUILD_ARTIFACTSTAGINGDIRECTORY/lib_lightgbm.so
^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cp ./lib_lightgbm.so "$BUILD_ARTIFACTSTAGINGDIRECTORY"/lib_lightgbm.so
In .ci/test.sh line 316:
for f in *.py **/*.py; do python $f || exit 1; done # run all examples
^-- SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
for f in *.py **/*.py; do python "$f" || exit 1; done # run all examples
In .ci/test.sh line 319:
jupyter nbconvert --ExecutePreprocessor.timeout=180 --to notebook --execute --inplace *.ipynb || exit 1 # run all notebooks
^-- SC2035 (info): Use ./*glob* or -- *glob* so names with dashes won't become options.
In .ci/test_r_package.sh line 23:
R_MAJOR_VERSION=( ${R_VERSION//./ } )
^---------------^ SC2206 (warning): Quote to prevent word splitting/globbing, or split robustly with mapfile or read -a.
In .ci/test_r_package.sh line 24:
if [[ "${R_MAJOR_VERSION}" == "3" ]]; then
^----------------^ SC2128 (warning): Expanding an array without an index only gives the first element.
In .ci/test_r_package.sh line 29:
elif [[ "${R_MAJOR_VERSION}" == "4" ]]; then
^----------------^ SC2128 (warning): Expanding an array without an index only gives the first element.
In .ci/test_r_package.sh line 73:
autoconf=$(cat R-package/AUTOCONF_UBUNTU_VERSION) \
^-- SC2046 (warning): Quote this to prevent word splitting.
In .ci/test_r_package.sh line 79:
https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1-linux-${ARCH}.sh \
^-----^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1-linux-"${ARCH}".sh \
In .ci/test_r_package.sh line 83:
sudo sh cmake-3.25.1-linux-${ARCH}.sh --skip-license --prefix=/opt/cmake || exit 1
^-----^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
sudo sh cmake-3.25.1-linux-"${ARCH}".sh --skip-license --prefix=/opt/cmake || exit 1
In .ci/test_r_package.sh line 103:
curl -sL ${R_MAC_PKG_URL} -o R.pkg || exit 1
^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
curl -sL "${R_MAC_PKG_URL}" -o R.pkg || exit 1
In .ci/test_r_package.sh line 105:
-pkg $(pwd)/R.pkg \
^----^ SC2046 (warning): Quote this to prevent word splitting.
In .ci/test_r_package.sh line 111:
if [[ "${R_MAJOR_VERSION}" == "3" ]]; then
^----------------^ SC2128 (warning): Expanding an array without an index only gives the first element.
In .ci/test_r_package.sh line 170:
cp ${PKG_TARBALL} packages
^------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cp "${PKG_TARBALL}" packages
In .ci/test_r_package.sh line 173:
-v $(pwd)/packages:/rchk/packages \
^----^ SC2046 (warning): Quote this to prevent word splitting.
In .ci/test_r_package.sh line 176:
2>&1 > ${RCHK_LOG_FILE} \
^--^ SC2069 (warning): To redirect stdout+stderr, 2>&1 must be last (or use '{ cmd > file; } 2>&1' to clarify).
In .ci/test_r_package.sh line 182:
exit $(
^-- SC2046 (warning): Quote this to prevent word splitting.
In .ci/test_r_package.sh line 195:
mkdir -p ${R_CMD_CHECK_DIR}
^----------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
mkdir -p "${R_CMD_CHECK_DIR}"
In .ci/test_r_package.sh line 196:
mv ${PKG_TARBALL} ${R_CMD_CHECK_DIR}
^------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
^----------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
mv "${PKG_TARBALL}" "${R_CMD_CHECK_DIR}"
In .ci/test_r_package.sh line 197:
cd ${R_CMD_CHECK_DIR}
^----------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cd "${R_CMD_CHECK_DIR}"
In .ci/test_r_package.sh line 204:
R CMD check ${PKG_TARBALL} \
^------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
R CMD check "${PKG_TARBALL}" \
In .ci/test_r_package.sh line 207:
|| check_succeeded="no"
^-------------^ SC2030 (info): Modification of check_succeeded is local (to subshell caused by (..) group).
In .ci/test_r_package.sh line 224:
if [[ $check_succeeded == "no" ]]; then
^--------------^ SC2031 (info): check_succeeded was modified in a subshell. That change might be lost.
In .ci/test_r_package.sh line 241:
passed_correct_r_version_to_cmake=$(
^-- SC2034 (warning): passed_correct_r_version_to_cmake appears unused. Verify use (or export if used externally).
In .ci/trigger_dispatch_run.sh line 40:
--arg pr_number "$(echo $pr | jq '.number')" \
^-^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
--arg pr_number "$(echo "$pr" | jq '.number')" \
In .ci/trigger_dispatch_run.sh line 41:
--arg pr_sha "$(echo $pr | jq '.head.sha')" \
^-^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
--arg pr_sha "$(echo "$pr" | jq '.head.sha')" \
In .ci/trigger_dispatch_run.sh line 42:
--arg pr_branch "$(echo $pr | jq '.head.ref')" \
^-^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
--arg pr_branch "$(echo "$pr" | jq '.head.ref')" \
In R-package/recreate-configure.sh line 11:
LGB_VERSION=$(cat VERSION.txt | sed "s/rc/-/g")
^---------^ SC2002 (style): Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
In R-package/recreate-configure.sh line 23:
autoconf=${AUTOCONF_VERSION}
^-----------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
autoconf="${AUTOCONF_VERSION}"
In build-cran-package.sh line 30:
set -e -E -u
^-- SC3041 (warning): In POSIX sh, set flag -E is undefined.
In build-cran-package.sh line 66:
LGB_VERSION=$(cat VERSION.txt | sed "s/rc/-/g")
^---------^ SC2002 (style): Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
In build-cran-package.sh line 94:
cp external_libs/eigen/Eigen/${eigen_module} "${EIGEN_R_DIR}/${eigen_module}"
^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cp external_libs/eigen/Eigen/"${eigen_module}" "${EIGEN_R_DIR}/${eigen_module}"
In build-cran-package.sh line 95:
if [ ${eigen_module} != "Dense" ]; then
^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
if [ "${eigen_module}" != "Dense" ]; then
In build-cran-package.sh line 97:
cp -R external_libs/eigen/Eigen/src/${eigen_module}/* "${EIGEN_R_DIR}/src/${eigen_module}/"
^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
cp -R external_libs/eigen/Eigen/src/"${eigen_module}"/* "${EIGEN_R_DIR}/src/${eigen_module}/"
In build-cran-package.sh line 133:
Rscript -e 'cat(.Platform$OS.type == "windows" && R.version[["major"]] < 4)'
^-- SC2016 (info): Expressions don't expand in single quotes, use double quotes for that.
In build-cran-package.sh line 145:
for file in $(find . -name '*.h' -o -name '*.hpp' -o -name '*.cpp'); do
^-- SC2044 (warning): For loops over find output are fragile. Use find -exec or a while read loop.
In build-cran-package.sh line 156:
find . -name '*.h.bak' -o -name '*.hpp.bak' -o -name '*.cpp.bak' -exec rm {} \;
^---^ SC2146 (warning): This action ignores everything before the -o. Use \( \) to group.
In build-cran-package.sh line 167:
rm *.bak
^-- SC2035 (info): Use ./*glob* or -- *glob* so names with dashes won't become options.
In build-python.sh line 65:
set -e -E -u
^-- SC3041 (warning): In POSIX sh, set flag -E is undefined.
In build-python.sh line 96:
if [[ "$1" != *=* ]];
^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined.
In build-python.sh line 103:
if [[ "$1" != *=* ]];
^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined.
In build-python.sh line 110:
if [[ "$1" != *=* ]];
^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined.
In build-python.sh line 117:
if [[ "$1" != *=* ]];
^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined.
In build-python.sh line 124:
if [[ "$1" != *=* ]];
^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined.
In build-python.sh line 131:
if [[ "$1" != *=* ]];
^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined.
In build-python.sh line 262:
external_libs/eigen/Eigen/${eigen_module} \
^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
external_libs/eigen/Eigen/"${eigen_module}" \
In build-python.sh line 263:
./lightgbm-python/external_libs/eigen/Eigen/${eigen_module}
^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
./lightgbm-python/external_libs/eigen/Eigen/"${eigen_module}"
In build-python.sh line 264:
if [ ${eigen_module} != "Dense" ]; then
^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
if [ "${eigen_module}" != "Dense" ]; then
In build-python.sh line 265:
mkdir -p ./lightgbm-python/external_libs/eigen/Eigen/src/${eigen_module}/
^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
mkdir -p ./lightgbm-python/external_libs/eigen/Eigen/src/"${eigen_module}"/
In build-python.sh line 268:
external_libs/eigen/Eigen/src/${eigen_module}/* \
^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
external_libs/eigen/Eigen/src/"${eigen_module}"/* \
In build-python.sh line 269:
./lightgbm-python/external_libs/eigen/Eigen/src/${eigen_module}/
^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
./lightgbm-python/external_libs/eigen/Eigen/src/"${eigen_module}"/
In build-python.sh line 316:
echo '[build-system]' >> ./pyproject.toml
^-- SC2129 (style): Consider using { cmd1; cmd2; } >> file instead of individual redirects.
In build-python.sh line 350:
${BUILD_ARGS} \
^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
"${BUILD_ARGS}" \
In build-python.sh line 360:
${BUILD_ARGS} \
^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
"${BUILD_ARGS}" \
In build-python.sh line 372:
${PIP_INSTALL_ARGS} \
^-----------------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
"${PIP_INSTALL_ARGS}" \
In docs/build-docs.sh line 11:
-o ${HOME}/miniforge.sh \
^-----^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
-o "${HOME}"/miniforge.sh \
In docs/build-docs.sh line 14:
/bin/bash ${HOME}/miniforge.sh -b -p ${CONDA}
^-----^ SC2086 (info): Double quote to prevent globbing and word splitting.
^------^ SC2086 (info): Double quote to prevent globbing and word splitting.
Did you mean:
/bin/bash "${HOME}"/miniforge.sh -b -p "${CONDA}"
In docs/build-docs.sh line 23:
source activate docs-env
^------^ SC1091 (info): Not following: activate was not specified as input (see shellcheck -x).
For more information:
https://www.shellcheck.net/wiki/SC1087 -- Use braces when expanding arrays,...
https://www.shellcheck.net/wiki/SC2034 -- passed_correct_r_version_to_cmake...
https://www.shellcheck.net/wiki/SC2044 -- For loops over find output are fr..
```
Summary
This project has several shell scripts. Those should be tested with
shellcheck
.Motivation
Shell scripts are used in this project for 2 primary purposes:
build-python.sh
is a public, user-facing API into building the Python packageChecking those scripts with static analyzers would help to reduce the risk of mistakes being silently missed. It'd also give us a chance of catching issues in code paths that aren't covered by CI.
Description
This should be done with
pre-commit
, using the latest version of https://pypi.org/project/shellcheck-py/.It is not necessary to fix all of the problems in a single pull request.
To work on this, add the
shellcheck-py
config linked in the docs above, then run this:That'll generate a list of errors. Put up a pull request that fixes some of them, and explain in the PR description exactly which errors it fixes.
As of this writing, that check returned the following:
full list of errors (click me)
```text In .ci/check_python_dists.sh line 3: set -e -E -u ^-- SC3041 (warning): In POSIX sh, set flag -E is undefined. In .ci/check_python_dists.sh line 19: twine check --strict ${DIST_DIR}/* || exit 1 ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: twine check --strict "${DIST_DIR}"/* || exit 1 In .ci/check_python_dists.sh line 23: check-wheel-contents ${DIST_DIR}/*.whl || exit 1 ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: check-wheel-contents "${DIST_DIR}"/*.whl || exit 1 In .ci/check_python_dists.sh line 27: if [ $PY_MINOR_VER -gt 7 ]; then ^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: if [ "$PY_MINOR_VER" -gt 7 ]; then In .ci/check_python_dists.sh line 37: ${DIST_DIR}/* || exit 1 ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: "${DIST_DIR}"/* || exit 1 In .ci/check_python_dists.sh line 38: elif { test $(uname -m) = "aarch64"; }; then ^---------^ SC2046 (warning): Quote this to prevent word splitting. In .ci/check_python_dists.sh line 45: ${DIST_DIR}/* || exit 1 ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: "${DIST_DIR}"/* || exit 1 In .ci/check_python_dists.sh line 52: ${DIST_DIR}/* || exit 1 ^---------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: "${DIST_DIR}"/* || exit 1 In .ci/install-clang-devel.sh line 35: clang-${CLANG_VERSION} \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: clang-"${CLANG_VERSION}" \ In .ci/install-clang-devel.sh line 36: clangd-${CLANG_VERSION} \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: clangd-"${CLANG_VERSION}" \ In .ci/install-clang-devel.sh line 37: clang-format-${CLANG_VERSION} \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: clang-format-"${CLANG_VERSION}" \ In .ci/install-clang-devel.sh line 38: clang-tidy-${CLANG_VERSION} \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: clang-tidy-"${CLANG_VERSION}" \ In .ci/install-clang-devel.sh line 39: clang-tools-${CLANG_VERSION} \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: clang-tools-"${CLANG_VERSION}" \ In .ci/install-clang-devel.sh line 40: lldb-${CLANG_VERSION} \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: lldb-"${CLANG_VERSION}" \ In .ci/install-clang-devel.sh line 41: lld-${CLANG_VERSION} \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: lld-"${CLANG_VERSION}" \ In .ci/install-clang-devel.sh line 42: llvm-${CLANG_VERSION}-dev \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: llvm-"${CLANG_VERSION}"-dev \ In .ci/install-clang-devel.sh line 43: llvm-${CLANG_VERSION}-tools \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: llvm-"${CLANG_VERSION}"-tools \ In .ci/install-clang-devel.sh line 44: libomp-${CLANG_VERSION}-dev \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: libomp-"${CLANG_VERSION}"-dev \ In .ci/install-clang-devel.sh line 45: libc++-${CLANG_VERSION}-dev \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: libc++-"${CLANG_VERSION}"-dev \ In .ci/install-clang-devel.sh line 46: libc++abi-${CLANG_VERSION}-dev \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: libc++abi-"${CLANG_VERSION}"-dev \ In .ci/install-clang-devel.sh line 47: libclang-common-${CLANG_VERSION}-dev \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: libclang-common-"${CLANG_VERSION}"-dev \ In .ci/install-clang-devel.sh line 48: libclang-${CLANG_VERSION}-dev \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: libclang-"${CLANG_VERSION}"-dev \ In .ci/install-clang-devel.sh line 49: libclang-cpp${CLANG_VERSION}-dev \ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: libclang-cpp"${CLANG_VERSION}"-dev \ In .ci/install-clang-devel.sh line 50: libunwind-${CLANG_VERSION}-dev ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: libunwind-"${CLANG_VERSION}"-dev In .ci/install-clang-devel.sh line 54: cp --remove-destination /usr/lib/llvm-${CLANG_VERSION}/bin/* /usr/bin/ ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cp --remove-destination /usr/lib/llvm-"${CLANG_VERSION}"/bin/* /usr/bin/ In .ci/lint-cpp.sh line 20: ${cmake_files} \ ^------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: "${cmake_files}" \ In .ci/rerun_workflow.sh line 38: runs=$(echo $runs | jq --arg pr_number "$pr_number" --arg pr_branch "$pr_branch" 'map(select(.event == "pull_request" and ((.pull_requests | length) != 0 and (.pull_requests[0].number | tostring) == $pr_number or .head_branch == $pr_branch)))') ^---^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: runs=$(echo "$runs" | jq --arg pr_number "$pr_number" --arg pr_branch "$pr_branch" 'map(select(.event == "pull_request" and ((.pull_requests | length) != 0 and (.pull_requests[0].number | tostring) == $pr_number or .head_branch == $pr_branch)))') In .ci/rerun_workflow.sh line 39: runs=$(echo $runs | jq 'sort_by(.run_number) | reverse') ^---^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: runs=$(echo "$runs" | jq 'sort_by(.run_number) | reverse') In .ci/rerun_workflow.sh line 41: if [[ $(echo $runs | jq 'length') -gt 0 ]]; then ^---^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: if [[ $(echo "$runs" | jq 'length') -gt 0 ]]; then In .ci/rerun_workflow.sh line 46: "${GITHUB_API_URL}/repos/microsoft/LightGBM/actions/runs/$(echo $runs | jq '.[0].id')/rerun" ^---^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: "${GITHUB_API_URL}/repos/microsoft/LightGBM/actions/runs/$(echo "$runs" | jq '.[0].id')/rerun" In .ci/set_commit_status.sh line 42: --arg state $status \ ^-----^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: --arg state "$status" \ In .ci/setup.sh line 143: https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-${ARCH}.sh ^------^ SC2046 (warning): Quote this to prevent word splitting. ^-----^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-"${ARCH}".sh In .ci/setup.sh line 144: sh miniforge.sh -b -p $CONDA ^----^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: sh miniforge.sh -b -p "$CONDA" In .ci/test.sh line 59: cmake -B build -S . -DBUILD_CPP_TEST=ON -DUSE_OPENMP=OFF -DUSE_DEBUG=ON $extra_cmake_opts ^---------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cmake -B build -S . -DBUILD_CPP_TEST=ON -DUSE_OPENMP=OFF -DUSE_DEBUG=ON "$extra_cmake_opts" In .ci/test.sh line 66: CONDA_PYTHON_REQUIREMENT="python=$PYTHON_VERSION[build=*cpython]" ^-- SC1087 (error): Use braces when expanding arrays, e.g. ${array[idx]} (or ${var}[.. to quiet). In .ci/test.sh line 69: mamba create -q -y -n $CONDA_ENV ${CONDA_PYTHON_REQUIREMENT} numpy ^-------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: mamba create -q -y -n $CONDA_ENV "${CONDA_PYTHON_REQUIREMENT}" numpy In .ci/test.sh line 70: source activate $CONDA_ENV ^------^ SC1091 (info): Not following: activate was not specified as input (see shellcheck -x). In .ci/test.sh line 92: cp ./build/lightgbmlib.jar $BUILD_ARTIFACTSTAGINGDIRECTORY/lightgbmlib_$OS_NAME.jar ^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cp ./build/lightgbmlib.jar "$BUILD_ARTIFACTSTAGINGDIRECTORY"/lightgbmlib_"$OS_NAME".jar In .ci/test.sh line 99: ${CONDA_PYTHON_REQUIREMENT} \ ^-------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: "${CONDA_PYTHON_REQUIREMENT}" \ In .ci/test.sh line 107: source activate $CONDA_ENV ^------^ SC1091 (info): Not following: activate was not specified as input (see shellcheck -x). In .ci/test.sh line 128: source activate $CONDA_ENV ^------^ SC1091 (info): Not following: activate was not specified as input (see shellcheck -x). In .ci/test.sh line 131: rstcheck --report-level warning $(find . -type f -name "*.rst") || exit 1 ^-----------------------------^ SC2046 (warning): Quote this to prevent word splitting. In .ci/test.sh line 133: rstcheck --report-level warning --ignore-directives=autoclass,autofunction,autosummary,doxygenfile $(find . -type f -name "*.rst") || exit 1 ^-----------------------------^ SC2046 (warning): Quote this to prevent word splitting. In .ci/test.sh line 163: ${CONDA_REQUIREMENT_FILES} \ ^------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: "${CONDA_REQUIREMENT_FILES}" \ In .ci/test.sh line 164: ${CONDA_PYTHON_REQUIREMENT} \ ^-------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: "${CONDA_PYTHON_REQUIREMENT}" \ In .ci/test.sh line 167: source activate $CONDA_ENV ^------^ SC1091 (info): Not following: activate was not specified as input (see shellcheck -x). In .ci/test.sh line 173: for LIBOMP_ALIAS in libgomp.dylib libiomp5.dylib libomp.dylib; do sudo ln -sf "$(brew --cellar libomp)"/*/lib/libomp.dylib $CONDA_PREFIX/lib/$LIBOMP_ALIAS || exit 1; done ^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: for LIBOMP_ALIAS in libgomp.dylib libiomp5.dylib libomp.dylib; do sudo ln -sf "$(brew --cellar libomp)"/*/lib/libomp.dylib "$CONDA_PREFIX"/lib/$LIBOMP_ALIAS || exit 1; done In .ci/test.sh line 179: pip install ./dist/lightgbm-$LGB_VER.tar.gz -v || exit 1 ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: pip install ./dist/lightgbm-"$LGB_VER".tar.gz -v || exit 1 In .ci/test.sh line 181: cp ./dist/lightgbm-$LGB_VER.tar.gz $BUILD_ARTIFACTSTAGINGDIRECTORY || exit 1 ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. ^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cp ./dist/lightgbm-"$LGB_VER".tar.gz "$BUILD_ARTIFACTSTAGINGDIRECTORY" || exit 1 In .ci/test.sh line 190: cp dist/lightgbm-$LGB_VER-py3-none-macosx*.whl $BUILD_ARTIFACTSTAGINGDIRECTORY || exit 1 ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. ^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cp dist/lightgbm-"$LGB_VER"-py3-none-macosx*.whl "$BUILD_ARTIFACTSTAGINGDIRECTORY" || exit 1 In .ci/test.sh line 204: ./dist/lightgbm-$LGB_VER-py3-none-$PLATFORM.whl || exit 1 ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. ^-------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: ./dist/lightgbm-"$LGB_VER"-py3-none-"$PLATFORM".whl || exit 1 In .ci/test.sh line 207: cp dist/lightgbm-$LGB_VER-py3-none-$PLATFORM.whl $BUILD_ARTIFACTSTAGINGDIRECTORY || exit 1 ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. ^-------^ SC2086 (info): Double quote to prevent globbing and word splitting. ^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cp dist/lightgbm-"$LGB_VER"-py3-none-"$PLATFORM".whl "$BUILD_ARTIFACTSTAGINGDIRECTORY" || exit 1 In .ci/test.sh line 226: ./dist/lightgbm-$LGB_VER.tar.gz \ ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: ./dist/lightgbm-"$LGB_VER".tar.gz \ In .ci/test.sh line 233: pip install ./dist/lightgbm-$LGB_VER*.whl -v || exit 1 ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: pip install ./dist/lightgbm-"$LGB_VER"*.whl -v || exit 1 In .ci/test.sh line 251: ./dist/lightgbm-$LGB_VER.tar.gz \ ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: ./dist/lightgbm-"$LGB_VER".tar.gz \ In .ci/test.sh line 258: pip install ./dist/lightgbm-$LGB_VER*.whl -v || exit 1 ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: pip install ./dist/lightgbm-"$LGB_VER"*.whl -v || exit 1 In .ci/test.sh line 271: ./dist/lightgbm-$LGB_VER.tar.gz \ ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: ./dist/lightgbm-"$LGB_VER".tar.gz \ In .ci/test.sh line 278: pip install ./dist/lightgbm-$LGB_VER*.whl -v || exit 1 ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: pip install ./dist/lightgbm-"$LGB_VER"*.whl -v || exit 1 In .ci/test.sh line 296: cp ./lib_lightgbm.dylib $BUILD_ARTIFACTSTAGINGDIRECTORY/lib_lightgbm.dylib ^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cp ./lib_lightgbm.dylib "$BUILD_ARTIFACTSTAGINGDIRECTORY"/lib_lightgbm.dylib In .ci/test.sh line 302: cp ./lib_lightgbm.so $BUILD_ARTIFACTSTAGINGDIRECTORY/lib_lightgbm.so ^-----------------------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cp ./lib_lightgbm.so "$BUILD_ARTIFACTSTAGINGDIRECTORY"/lib_lightgbm.so In .ci/test.sh line 316: for f in *.py **/*.py; do python $f || exit 1; done # run all examples ^-- SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: for f in *.py **/*.py; do python "$f" || exit 1; done # run all examples In .ci/test.sh line 319: jupyter nbconvert --ExecutePreprocessor.timeout=180 --to notebook --execute --inplace *.ipynb || exit 1 # run all notebooks ^-- SC2035 (info): Use ./*glob* or -- *glob* so names with dashes won't become options. In .ci/test_r_package.sh line 23: R_MAJOR_VERSION=( ${R_VERSION//./ } ) ^---------------^ SC2206 (warning): Quote to prevent word splitting/globbing, or split robustly with mapfile or read -a. In .ci/test_r_package.sh line 24: if [[ "${R_MAJOR_VERSION}" == "3" ]]; then ^----------------^ SC2128 (warning): Expanding an array without an index only gives the first element. In .ci/test_r_package.sh line 29: elif [[ "${R_MAJOR_VERSION}" == "4" ]]; then ^----------------^ SC2128 (warning): Expanding an array without an index only gives the first element. In .ci/test_r_package.sh line 73: autoconf=$(cat R-package/AUTOCONF_UBUNTU_VERSION) \ ^-- SC2046 (warning): Quote this to prevent word splitting. In .ci/test_r_package.sh line 79: https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1-linux-${ARCH}.sh \ ^-----^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1-linux-"${ARCH}".sh \ In .ci/test_r_package.sh line 83: sudo sh cmake-3.25.1-linux-${ARCH}.sh --skip-license --prefix=/opt/cmake || exit 1 ^-----^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: sudo sh cmake-3.25.1-linux-"${ARCH}".sh --skip-license --prefix=/opt/cmake || exit 1 In .ci/test_r_package.sh line 103: curl -sL ${R_MAC_PKG_URL} -o R.pkg || exit 1 ^--------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: curl -sL "${R_MAC_PKG_URL}" -o R.pkg || exit 1 In .ci/test_r_package.sh line 105: -pkg $(pwd)/R.pkg \ ^----^ SC2046 (warning): Quote this to prevent word splitting. In .ci/test_r_package.sh line 111: if [[ "${R_MAJOR_VERSION}" == "3" ]]; then ^----------------^ SC2128 (warning): Expanding an array without an index only gives the first element. In .ci/test_r_package.sh line 170: cp ${PKG_TARBALL} packages ^------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cp "${PKG_TARBALL}" packages In .ci/test_r_package.sh line 173: -v $(pwd)/packages:/rchk/packages \ ^----^ SC2046 (warning): Quote this to prevent word splitting. In .ci/test_r_package.sh line 176: 2>&1 > ${RCHK_LOG_FILE} \ ^--^ SC2069 (warning): To redirect stdout+stderr, 2>&1 must be last (or use '{ cmd > file; } 2>&1' to clarify). In .ci/test_r_package.sh line 182: exit $( ^-- SC2046 (warning): Quote this to prevent word splitting. In .ci/test_r_package.sh line 195: mkdir -p ${R_CMD_CHECK_DIR} ^----------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: mkdir -p "${R_CMD_CHECK_DIR}" In .ci/test_r_package.sh line 196: mv ${PKG_TARBALL} ${R_CMD_CHECK_DIR} ^------------^ SC2086 (info): Double quote to prevent globbing and word splitting. ^----------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: mv "${PKG_TARBALL}" "${R_CMD_CHECK_DIR}" In .ci/test_r_package.sh line 197: cd ${R_CMD_CHECK_DIR} ^----------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cd "${R_CMD_CHECK_DIR}" In .ci/test_r_package.sh line 204: R CMD check ${PKG_TARBALL} \ ^------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: R CMD check "${PKG_TARBALL}" \ In .ci/test_r_package.sh line 207: || check_succeeded="no" ^-------------^ SC2030 (info): Modification of check_succeeded is local (to subshell caused by (..) group). In .ci/test_r_package.sh line 224: if [[ $check_succeeded == "no" ]]; then ^--------------^ SC2031 (info): check_succeeded was modified in a subshell. That change might be lost. In .ci/test_r_package.sh line 241: passed_correct_r_version_to_cmake=$( ^-- SC2034 (warning): passed_correct_r_version_to_cmake appears unused. Verify use (or export if used externally). In .ci/trigger_dispatch_run.sh line 40: --arg pr_number "$(echo $pr | jq '.number')" \ ^-^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: --arg pr_number "$(echo "$pr" | jq '.number')" \ In .ci/trigger_dispatch_run.sh line 41: --arg pr_sha "$(echo $pr | jq '.head.sha')" \ ^-^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: --arg pr_sha "$(echo "$pr" | jq '.head.sha')" \ In .ci/trigger_dispatch_run.sh line 42: --arg pr_branch "$(echo $pr | jq '.head.ref')" \ ^-^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: --arg pr_branch "$(echo "$pr" | jq '.head.ref')" \ In R-package/recreate-configure.sh line 11: LGB_VERSION=$(cat VERSION.txt | sed "s/rc/-/g") ^---------^ SC2002 (style): Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead. In R-package/recreate-configure.sh line 23: autoconf=${AUTOCONF_VERSION} ^-----------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: autoconf="${AUTOCONF_VERSION}" In build-cran-package.sh line 30: set -e -E -u ^-- SC3041 (warning): In POSIX sh, set flag -E is undefined. In build-cran-package.sh line 66: LGB_VERSION=$(cat VERSION.txt | sed "s/rc/-/g") ^---------^ SC2002 (style): Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead. In build-cran-package.sh line 94: cp external_libs/eigen/Eigen/${eigen_module} "${EIGEN_R_DIR}/${eigen_module}" ^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cp external_libs/eigen/Eigen/"${eigen_module}" "${EIGEN_R_DIR}/${eigen_module}" In build-cran-package.sh line 95: if [ ${eigen_module} != "Dense" ]; then ^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: if [ "${eigen_module}" != "Dense" ]; then In build-cran-package.sh line 97: cp -R external_libs/eigen/Eigen/src/${eigen_module}/* "${EIGEN_R_DIR}/src/${eigen_module}/" ^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: cp -R external_libs/eigen/Eigen/src/"${eigen_module}"/* "${EIGEN_R_DIR}/src/${eigen_module}/" In build-cran-package.sh line 133: Rscript -e 'cat(.Platform$OS.type == "windows" && R.version[["major"]] < 4)' ^-- SC2016 (info): Expressions don't expand in single quotes, use double quotes for that. In build-cran-package.sh line 145: for file in $(find . -name '*.h' -o -name '*.hpp' -o -name '*.cpp'); do ^-- SC2044 (warning): For loops over find output are fragile. Use find -exec or a while read loop. In build-cran-package.sh line 156: find . -name '*.h.bak' -o -name '*.hpp.bak' -o -name '*.cpp.bak' -exec rm {} \; ^---^ SC2146 (warning): This action ignores everything before the -o. Use \( \) to group. In build-cran-package.sh line 167: rm *.bak ^-- SC2035 (info): Use ./*glob* or -- *glob* so names with dashes won't become options. In build-python.sh line 65: set -e -E -u ^-- SC3041 (warning): In POSIX sh, set flag -E is undefined. In build-python.sh line 96: if [[ "$1" != *=* ]]; ^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined. In build-python.sh line 103: if [[ "$1" != *=* ]]; ^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined. In build-python.sh line 110: if [[ "$1" != *=* ]]; ^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined. In build-python.sh line 117: if [[ "$1" != *=* ]]; ^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined. In build-python.sh line 124: if [[ "$1" != *=* ]]; ^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined. In build-python.sh line 131: if [[ "$1" != *=* ]]; ^---------------^ SC3010 (warning): In POSIX sh, [[ ]] is undefined. In build-python.sh line 262: external_libs/eigen/Eigen/${eigen_module} \ ^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: external_libs/eigen/Eigen/"${eigen_module}" \ In build-python.sh line 263: ./lightgbm-python/external_libs/eigen/Eigen/${eigen_module} ^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: ./lightgbm-python/external_libs/eigen/Eigen/"${eigen_module}" In build-python.sh line 264: if [ ${eigen_module} != "Dense" ]; then ^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: if [ "${eigen_module}" != "Dense" ]; then In build-python.sh line 265: mkdir -p ./lightgbm-python/external_libs/eigen/Eigen/src/${eigen_module}/ ^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: mkdir -p ./lightgbm-python/external_libs/eigen/Eigen/src/"${eigen_module}"/ In build-python.sh line 268: external_libs/eigen/Eigen/src/${eigen_module}/* \ ^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: external_libs/eigen/Eigen/src/"${eigen_module}"/* \ In build-python.sh line 269: ./lightgbm-python/external_libs/eigen/Eigen/src/${eigen_module}/ ^-------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: ./lightgbm-python/external_libs/eigen/Eigen/src/"${eigen_module}"/ In build-python.sh line 316: echo '[build-system]' >> ./pyproject.toml ^-- SC2129 (style): Consider using { cmd1; cmd2; } >> file instead of individual redirects. In build-python.sh line 350: ${BUILD_ARGS} \ ^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: "${BUILD_ARGS}" \ In build-python.sh line 360: ${BUILD_ARGS} \ ^-----------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: "${BUILD_ARGS}" \ In build-python.sh line 372: ${PIP_INSTALL_ARGS} \ ^-----------------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: "${PIP_INSTALL_ARGS}" \ In docs/build-docs.sh line 11: -o ${HOME}/miniforge.sh \ ^-----^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: -o "${HOME}"/miniforge.sh \ In docs/build-docs.sh line 14: /bin/bash ${HOME}/miniforge.sh -b -p ${CONDA} ^-----^ SC2086 (info): Double quote to prevent globbing and word splitting. ^------^ SC2086 (info): Double quote to prevent globbing and word splitting. Did you mean: /bin/bash "${HOME}"/miniforge.sh -b -p "${CONDA}" In docs/build-docs.sh line 23: source activate docs-env ^------^ SC1091 (info): Not following: activate was not specified as input (see shellcheck -x). For more information: https://www.shellcheck.net/wiki/SC1087 -- Use braces when expanding arrays,... https://www.shellcheck.net/wiki/SC2034 -- passed_correct_r_version_to_cmake... https://www.shellcheck.net/wiki/SC2044 -- For loops over find output are fr.. ```References