我正在使用带有“excl”选项的 dd。如果用 CTRL+C 中断,“dd”会保留它已创建但未完成写入的文件。在这种情况下,我需要使用陷阱 INT 来清理它。但是,我不知道在这种情况下如何测试该文件是否之前已经存在或由 dd 创建。换句话说,“excl”是否已启动从 dd 退出或其他操作。退出状态可能无法在陷阱内部告诉它,因为其他命令可以返回相同的代码。将 if [ -e file ] 放在 dd 之前可以工作,但不是原子的。该文件可以由中间的其他应用程序创建。只需要一些优雅的解决方案。
答案1
bash 和文件重定向:
清理() { 执行 {fd}>&- rm -f "$输出" } 设置-e 设置-o noclobber # 使用 noclobber,如果输出文件存在,重定向将失败 exec {fd}>"$out" || 退出 3 陷阱“清理;退出 4”INT TERM ERR EXIT # 写入已打开的文件 dd if=/dev/zero of=/dev/fd/$fd bs=256k count=$(( size*4 )) # /dev/fd/$fd 的替代方案是使用 >&$fd 进行重定向 执行 {fd}>&-
临时文件:
清理() { rm-f“$temp” } 设置-e temp=$(mktemp "${out}_XXXXXX") || 退出 3 陷阱“清理;退出 4”INT TERM ERR EXIT dd if=/dev/zero of="$temp" bs=256k count=$(( size*4 )) mv-n“$temp”“$out”