在 bash 脚本中包含源代码时,如何修复或屏蔽 shellcheck 发现的 1091 错误?

How do you fix or mask a 1091 error found with shellcheck when including a source in a bash script?

Shellsheck 是 shell 脚本的静态分析工具,可以在某些 Linux 系统上本地安装,无需在线安装即可用于检查 bash 脚本的某些错误。

测试环境:

main.sh

#!/bin/bash

source ./sourcefile.sh

echo "Output from main.sh"
echo
echo

fkt_output_from_sourcefile_sh
echo
echo

echo "For closing window, press Enter or Ctl + C"; read -r

sourcefile.sh

#!/bin/bash

fkt_output_from_sourcefile_sh() {
        echo "Output from sourcefile.sh"
    }

我是如何在终端上运行它的:

shellcheck -x main.sh

终端输出(看起来工作正常):

Output from main.sh


Output from sourcefile.sh


For closing window, press Enter or Ctl + C

通过 shellcheck -x:

检查的错误消息
In /home/user/desktop/main.sh line 8:
    source ./sourcefile.sh
    ^-- SC1091: Not following: ./sourcefile.sh: openBinaryFile: does not exist (No such file or directory)

可能的解决方案(这对我不起作用,可能取决于我的语法错误):

无效解决方案示例:

基于: “告诉 ShellCheck 在哪里可以找到源文件(自 0.4.0 起):”

# shellcheck source=src/examples/config.sh
. "$(locate_config)"

来源:

main.sh

#!/bin/bash

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

    echo "Output from main.sh"
    echo
    echo

    fkt_output_from_sourcefile_sh
    echo
    echo

echo "For closing window, press Enter or Ctl + C"; read -r

sourcefile.sh :

#!/bin/bash

fkt_output_from_sourcefile_sh() {
        echo "Output from sourcefile.sh"
    }

终端错误信息:

/home/user/desktop/main.sh: Line 4: find_install_dir: Command not found.
/home/user/desktop/main.sh: Line 4: /sourcefile.sh: File or folder not found
Output from main.sh


/home/user/desktop/main.sh: Line 10: fkt_output_from_sourcefile_sh: Command not found.


For closing window, press Enter or Ctl + C

我更好地审查了你的情况,并在 shellcheck 的 github 上发现了这个问题: https://github.com/koalaman/shellcheck/issues/1356 (This specific comment)

据我了解,开发人员提到了 2 个解决方案:

1.解决 SC1091:
因为您编辑的代码也没有再次向我显示此错误,而且我没有在 source ./sourcefile.sh 上方看到您关于 SC1091shellcheck 评论,我只能建议您添加此评论在 main.sh,并再次检查:

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

然后运行:

$ shellcheck main.sh

2。如果 shellcheck 是使用 snap 安装的,请阅读此内容:
snap 将阻止访问不在 /home//media 中的任何其他目录,但查看您的日志时,您的脚本似乎在 /home/user 中,所以这不是问题,可能是 # 1.