AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 833088
Accepted
Zaza
Zaza
Asked: 2017-02-17 17:37:01 +0800 CST2017-02-17 17:37:01 +0800 CST 2017-02-17 17:37:01 +0800 CST

运行前完整的 bash 脚本检查

  • 772

尝试在 bash 脚本中实现自我语法检查以在test.sh 执行脚本之前运行语法检查。

error_exit()
{
        echo -e "$1" 1>&2
        exit 1
}
bash -n "$(basename $BASH_SOURCE)"
RESULT=$?
if [ $RESULT == 0 ]; then
  echo "[OK] Test pass"
else
  error_exit "Something is not right :( \n check the sytntax"
fi
starting-script

bash -nbash -x,如果有一些严重的语法错误但像以下小错误,则与工作 相同:

echo "somthing" && sleep5&&
./test.sh: line 14: sleep5: command not found

被忽略...

有什么方法可以处理完整的语法检查,并且可以在某种“沙盒模式”/“模拟模式”中运行脚本以捕获所有可能的错误,如果有错误则返回?

已编辑 如果脚本必须将脚本的某些部分复制到远程服务器中,例如在数百个从属服务器(受监控的服务器)上安装 nagios 的脚本等。不幸的是,文本复制并不总是顺利进行,错误可能是由将脚本自动复制为文本时发生错误,如果检测到任何错误,检查并结束脚本很重要。

linux bash syntax
  • 3 3 个回答
  • 346 Views

3 个回答

  • Voted
  1. techraf
    2017-02-17T17:55:01+08:002017-02-17T17:55:01+08:00

    你可以看看ShellCheck项目,它对 shell 脚本语法进行了更彻底的验证;包括最佳实践和潜在的陷阱。

    但是,即使 ShellCheck 也不会将您问题中的示例报告为不正确,因为没有语法错误。

    sleep5您正在调用一个在语法上有效的外部命令。

    在调用它们之前使用变量并检查命令是否存在,如果不存在则优雅地失败。

    • 5
  2. Best Answer
    Phillip -Zyan K Lee- Stockmann
    2017-02-18T00:16:21+08:002017-02-18T00:16:21+08:00

    正如@techraf 和@Wice22 指出的那样,在运行时没有完整的检查。

    不过,您可以为您的 bash 脚本创建“单元”测试。一个有助于它的框架是 BATS:https
    ://github.com/sstephenson/bats 这些测试可以由 CI 系统在每次提交到你的 git repo 时运行,所以你会在这些脚本命中之前看看你是否搞砸了生产。

    但是,使用 BATS,您的脚本没有自动测试,但您必须自己实现每个测试。

    编辑:关于您的编辑:您可以创建要复制的脚本的 md5sum,将它们都复制(远程脚本和 md5sum 文件)并远程检查脚本是否仍然与 md5sum 匹配。

    • 2
  3. user387656
    2017-02-17T20:31:40+08:002017-02-17T20:31:40+08:00

    据我所知,bash 中没有“沙盒模式”这样的东西,没有 try/catch eater 要捕获 bash 中的错误,您需要运行脚本。试试这个线程https://stackoverflow.com/questions/22009364/is-there-a-try-catch-command-in-bash 您可以使用如图所示的子外壳来模拟救助,使用该技术您可能会如果检测到“异常”,可以在任何时候停止脚本,但这不是模拟。所以它会是这样的:

    #!/bin/bash
    script_name=$(basename $0)
    error_exit() { echo -e "${script_name} file:  ${1:-"Unknown Error"}" 1>&2
    exit 1
    }
    bash -n "$(basename $BASH_SOURCE)"
    RESULT=$?
    if [ $RESULT == 0 ]; then
      echo $" ${green}[OK] Test pass${reset} "
    else
      error_exit "syntax error detected"
    fi
    echo "Check pass ok"
    
    bash -e <<TRY
      echo "" && sleep5
      echo"and_somthing else"
      echo"and_some_more stuff"
      echo"and some_more"
    TRY
    if [ $? -ne 0 ]; then
      error_exit "error detected"
    fi
    echo "continuing if all goes well"
    
    • 1

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve