2

Я использую dd с опцией "excl". Если прервано с помощью CTRL+C, "dd" оставляет созданный файл и не завершает запись. Мне нужно очистить его в таком случае с ловушкой INT. Тем не менее, я не знаю, как в таком случае проверить, существовал ли файл уже раньше или он был создан dd. Другими словами, "excl" инициировал выход из dd или что-то еще. Состояние выхода может не указывать это прямо в ловушке, поскольку другие команды могут возвращать тот же код. Помещение if [-e file] перед dd будет работать, но не атомарно. Файл может быть создан другим приложением между ними. Просто нужно какое-то элегантное решение.

1 ответ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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .