在 BASH 脚本的其余部分完成后,如何将命令保存为 运行?

In BASH How Do I save up commands to be run after the rest of the script has completed?

我有一个 bash 脚本遍历 >10 TB 大小的磁盘,完成后,我想在其余脚本之后发出我认为的“清理命令”活动已经完成。 ...我只能在遍历目录结构时发现需要 运行 这些,但在所有其他处理完成后必须 运行 这些最终命令。 ...我希望这很清楚我想做什么。

当然我可以将它们放在一个文件中并在退出之前执行它,但我希望有一些东西不会留下文件系统足迹并且只在内存中留下 运行 因为考虑到它可能会持续多长时间转到 运行,它可能需要中断,我不想在事后处理文件系统清理。也许我可以使用一个数组,然后遍历数组并取消引用数组中的条目并一次执行一个? ... 我在 BASH 方面没有很多阵列经验,但我的猜测是这是正确的基本方向。但是,也许还有更聪明的事情要做?

谢谢。

一个简单的实现可能如下所示:

cleanup_cmds=( )            # initialize an empty array
on_cleanup() {              # define a function to use to append to that array
  local cmd_str
  printf -v cmd_str '%q ' "$@"
  cleanup_cmds+=( cmd_str )
}
run_cleanup_cmds() {        # define a function to run everything in that array
  for cmd in "${cleanup_cmds[@]}"; do
    eval "$cmd"
  done
}
trap run_cleanup_cmds EXIT  # run everything in the array on exit

无论何时你想向数组中添加一个项目,都非常简单:

tmpfile=$(mktemp -t foobar.XXXXXX)
on_cleanup rm -f -- "$tmpfile"

...并添加该项目,即使命令在参数中包含 quotes/spaces/etc 也能正常运行。