【问题标题】:What is the 'undo' command in base-level shell script?什么是基本 shell 脚本中的“撤消”命令?
【发布时间】:2020-11-27 04:24:23
【问题描述】:

我正在尝试将旧的安装脚本转换为 Dockerfile 并不断遇到这样的语法:

  # unpack the tar
  reportandprint "..Unpacking archive\n"
  suWrap "tar xf $DISTDIR/$ISTAR"
  undo "rm -rf $INSROOT/$ISDIR/*"

  # make /var and /etc trees
  reportandprint "..Creating cache directory\n"
  reportcmdandeval "mv $INSROOT/$ISDIR/var $VARROOT/$ISDIR"
  undo "rm -rf $VARROOT/$ISDIR"
  suWrap "ln -s $VARROOT/$ISDIR $INSROOT/$ISDIR/var"
  suWrap "mkdir $INSROOT/$ISDIR/var/catalogs"
  undo "rm -f $INSROOT/$ISDIR/var"

有人可以在这里向我解释一下“撤消”命令的用法吗?如果上一行无法执行,这是一个后备吗?这似乎不是常见的用法,到目前为止,我在网上搜索到的只是很多人希望“撤消”他们在 shell 中无意中完成的事情:)

任何帮助将不胜感激!

【问题讨论】:

  • undo 不是标准命令。它可能是您特定项目中定义的函数。
  • 这些命令都不是标准的 Linux 命令。检查脚本的其余部分,看看它们是否被定义为函数。
  • 这些命令不仅是非标准的,而且它们的定义方式也使它们容易出错。有能力的人会接受参数列表作为数组,而不是字符串。

标签: linux shell unix scripting


【解决方案1】:

它们很可能是脚本中的辅助函数。看看它们是如何定义的。

我的猜测是 undo 保留了一系列命令以撤消迄今为止的脚本进度(可能在 INT/EXIT 上使用 trap 激活)。
suWrap 将以超级用户身份运行该行,reportandprint 将为文本输出添加前缀和格式。

帮助函数有助于使您的脚本更短且更易于阅读。例如。假设您要停止脚本并在 stderr (2) 上打印错误消息。
你可以去:echo "Error: this error" >&2; exit 1 每次。 但最好定义一个为您执行此操作的函数并在整个脚本中使用它。

errexit() {
  printf "Error:\t %s\n" "$@" >&2
  exit 1
}
 
errexit "this error"
errexit "that error"

貌似reportandprint和其他命令都是这样使用的但是你必须找到函数定义的地方才能找到。

【讨论】:

    猜你喜欢
    • 2018-10-17
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2014-11-21
    • 2016-11-14
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多