shell - 编写健壮的 shell 脚本的规则是什么?

标签 shell robustness

我最近用我写的一个 shell 脚本删除了我的主目录的一部分。幸运的是,我确实足够快地按下 Ctrl-C 以避免最坏的情况。

我的错误是过分依赖相对路径。从现在开始,我总是在更改目录时使用绝对路径……但是,这让我想到了一个有趣的问题:编写健壮的 shell 脚本的规则是什么?

我已经知道从一个目录移动到另一个目录时应该始终使用绝对路径。但是,必须有很多其他的(例如,当命令失败时该怎么办,停止脚本并通知用户的好方法是什么)。

那么,是否有人有专门针对 shell 脚本的此类规则和提示的列表?

最佳答案

几个想法:

  • 使用 -e Shebang 中的标志,例如 #!/bin/sh -e .这样脚本就会在第一个错误处停止。有点像扔RuntimeException在 java 。这可能确实救了我几次,我觉得在这种情况下它也会帮助你。
  • 处理脚本中所有语句的退出代码。实际使用 -e在shebang中会强制你这样做。
  • 不要用 ; 链接命令.使用 &&反而。再次使用 -e在shebang中会强制你这样做。
  • 正确引用可能包含空格或其他特殊字符的路径。
  • 如果脚本在不带参数的情况下使用时不做危险的事情,那么最好。
  • 对于非平凡的脚本,请确保 -h--help打印有用消息的标志。 (我使用 this script 生成带有标志解析的脚本。)对于在不带参数的情况下调用时可能会做危险事情的脚本,这应该是强制性的。
  • 使用显式 exit 1 退出脚本在任何非正常退出。在 if 中处理错误是一个常见的错误。块,echo一些有用的消息,然后 exit没有任何争论。自 exit使用最后一个命令的退出代码,在本例中 echo ,它将成功退出。请注意,在我之前链接的示例脚本中,我 exit 1处理 --help 时打印帮助信息后旗帜。
  • 如果您不需要bash功能,使用 #!/bin/sh shebang 并尝试与旧版本保持兼容。我认为便携是一种鲁棒性。
  • 使用 $()而不是 `` .更容易阅读~~更难犯错误。
  • 良好且一致地格式化您的代码。更容易阅读~~健壮性。
  • 请注意平台之间的差异。例如 date --isodate +%F2013-11-17 格式打印日期,但第一个只适用于 GNU 系统,第二个也适用于 BSD 和 Solaris。所以使用 date +%F总是,它适用于任何地方。像这样的例子当然有数百个。如果您每天都在做一些不习惯的事情,请尝试检查它是否也适用于不同的系统。
  • 测试空变量,尤其是在危险的命令中,例如 rm -fr .例如 rm -rf "$TOPDIR/$OBJDIR" 的结果如果 TOPDIR 或/和 OBJDIR 恰好为空或未设置,则可能是灾难性的。通常,双重检查或三重检查像这样的危险命令的可能参数值。
  • 不要突破 shell 脚本的限制。脚本应该是胶水代码。如果您发现自己在做一些棘手的事情,或者您需要晦涩的功能,那么您最好转向更强大的语言。

  • 最后,这些都不会阻止你犯愚蠢的错误。

    PS:我会继续回来并添加更多我记得的东西。请随时提出改进建议,我会添加它们。谢谢。

    关于shell - 编写健壮的 shell 脚本的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20034614/

    相关文章:

    bash - 无法将点分配给 Bash shell 中的变量

    functional-programming - Lisp 中的选项类型编码/稳健性

    shell - 从编译的可执行文件生成 CLI shell 脚本代码?

    php - 检查NFS共享是否在PHP中启动

    python - 加强python UDP服务器

    bash - 在 bash 脚本中插入包含 '$' 的变量

    linux - 表达式 "</dev/null some_command"有什么作用?

    linux - 在 bash 脚本中发出回显变量

    linux - bash 中的 "batch"文件

    java - 封装 SQL 平台差异的策略?