gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:27:52 26 4
gpt4 key购买 nike

我最近用我写的一个 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com