问题描述
我有一个 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"
...并添加项目,即使命令在参数中包含引号/空格/等也能正常运行。