Другой подход - cp
то /dev/null
к файлу
xieerqi:$ cat testFile.txt Filesystem 1K-blocks Used Available Use% Mounted on/dev/sda1 115247656 83100492 26269816 76% /none 4 0 4 0% /sys/fs/cgroupudev 2914492 4 2914488 1% /devtmpfs 585216 1152 584064 1% /runnone 5120 0 5120 0% /run/locknone 2926072 98096 2827976 4% /run/shmnone 102400 76 102324 1% /run/userxieerqi:$ cp /dev/null testFile.txt xieerqi:$ cat testFile.txtxieerqi:$
Почему это работает и как это работает? То testFile.txt
будет открыт с O_WRONLY|O_TRUNC
флаги, что означает, что если файл существует - он будет усечен, что означает, что содержимое отброшено, а размер установлен на ноль. Это тот же флаг, с которым >
оператор в командной оболочке открывает файл справа от этого оператора.
Следующий, cp
попытается прочитать из /dev/null
и после чтения 0 байт просто закроет оба файла, тем самым оставив testFile.txt
усечено, а содержимое эффективно удалено.
Зная это, мы теоретически могли бы использовать все, что позволяет нам открывать файл с O_TRUNC
. Например, это:
dd of=testFile.txt count=0
Небольшая разница здесь заключается в том, что dd
не будет выполнять никаких read()
вообще. Большой плюс этого dd
версия заключается в том, что она легко переносима. То технические характеристики dd государство:
Если преобразование seek= expr также не указано, выходной файл должен быть усечен до начала копирования, если указан явный операнд of= file, если не указано conv= notrunc.
По контрасту cp /dev/null testFile.txt
не обязательно переносим, поскольку Спецификации POSIX для cp рассмотрим, что происходит, только если source_file нерегулярен и когда -r
/-R
флаги указаны (большое спасибо Стивен Китт за то, что указал на это), но не то, что происходит, когда -r
или -R
опущены, как и в данном случае. Однако, похоже, по крайней мере, GNU cp
по умолчанию используется правило 3 в той же спецификации, которое усекает существующий файл без изменения его типа.