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

问题描述

我有一个 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"

...并添加项目,即使命令在参数中包含引号/空格/等也能正常运行。