Я использую dd с опцией "excl". Если прервано с помощью CTRL+C, "dd" оставляет созданный файл и не завершает запись. Мне нужно очистить его в таком случае с ловушкой INT. Тем не менее, я не знаю, как в таком случае проверить, существовал ли файл уже раньше или он был создан dd. Другими словами, "excl" инициировал выход из dd или что-то еще. Состояние выхода может не указывать это прямо в ловушке, поскольку другие команды могут возвращать тот же код. Помещение if [-e file] перед dd будет работать, но не атомарно. Файл может быть создан другим приложением между ними. Просто нужно какое-то элегантное решение.
1 ответ
3
перенаправление bash и файлов:
cleanup() { exec {fd}>&- rm -f "$out" } set -e set -o noclobber # with noclobber, redirection will fail if output file exists exec {fd}>"$out" || exit 3 trap "cleanup; exit 4" INT TERM ERR EXIT # write to already opened file dd if=/dev/zero of=/dev/fd/$fd bs=256k count=$(( size*4 )) # alternative to /dev/fd/$fd is redirecting with >&$fd exec {fd}>&-
Временные файлы:
cleanup() { rm -f "$temp" } set -e temp=$(mktemp "${out}_XXXXXX") || exit 3 trap "cleanup; exit 4" INT TERM ERR EXIT dd if=/dev/zero of="$temp" bs=256k count=$(( size*4 )) mv -n "$temp" "$out"