Чому б ти котів / dev / null ні на що?
Ви зробите це для врізання вмісту файлу, зберігаючи inode недоторканою. Усі програми, у яких цей файл відкритий для читання чи запису, не впливатимуть поза тим, що розмір файлу буде скинутий до нуля.
Часто зустрічається хибна альтернатива - це видалити файл, а потім створити його знову:
rm file
touch file
або подібне:
mv file file.old
gzip file.old
touch file
Проблема полягає в тому, що ці методи не перешкоджають збереженню старого файлу будь-якими процесами, що видаляють файл, відкритий під час видалення. Причина, чому знаходиться під файловими системами Unix, коли ви видаляєте файл, ви лише від'єднуєте його ім’я (шлях) від його вмісту (inode). Інода зберігається живою, доки є процеси, відкриті для читання чи письма.
Це призводить до декількох негативних ефектів: журнали, написані після видалення файлу, втрачаються, оскільки не існує прямого / портативного способу відкрити видалений файл. Поки процес записується до видаленого файлу, його вміст все ще використовує простір у файловій системі. Це означає, що якщо ви видалите / створите файл, оскільки він заповнював ваш диск, диск залишається заповненим. Один із способів виправити цю останню проблему - це перезапустити процеси реєстрації, але ви, можливо, не захочете цього робити для критичних служб і журналів посередників остаточно втратяться. Існують також побічні ефекти, зумовлені тим, що створений вами файл може не мати таких самих дозволів, власника та групи, як оригінальний. Це, наприклад, може завадити аналізатору журналу читати новостворений файл, або ще гірше, запобігти процесу реєстрації записів власних журналів.
Перший метод - cat /dev/null > file
досягти мети належним чином, проте, незважаючи на завзяту міську легенду, його cat /dev/null
частина не робить нічого корисного. Він відкриває псевдофайл, який порожній за дизайном, не вдається прочитати з нього нічого і, нарешті, просто виходить. Використання цієї команди - це марно натискання клавіш, байтів, системних викликів та циклів процесора, і його можна без будь-яких функціональних змін замінити, безсумнівно, швидшою командою без операції :
або навіть, з більшості оболонок, зовсім не командою.
Дозвольте спробувати метафору, щоб пояснити, наскільки це марно cat /dev/null
. Скажімо, ваша мета - спорожнити склянку.
Спочатку ви виймаєте з нього будь-яку рідину. Цього достатньо і саме те, що ( > file
) робить з огляду на те, що перенаправлення завжди обробляються першими.
Потім ви вибираєте порожню пляшку ( /dev/null
) і наливаєте її в порожню склянку ( cat
). Це безглуздий крок ...
Якщо ви прочитаєте зв'язаний документ до кінця, ви можете помітити коментарі в цьому рядку з розширеної версії сценарію:
cat / dev / null> wtmp # ':> wtmp' і '> wtmp' мають однаковий ефект.
Вони справді є; занадто погано cat /dev/null
зберігалося в коді.
Це означає, що наступний код буде працювати з усіма загальними оболонками ( csh
і sh
сім'ями):
cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."
і це буде працювати з усіма оболонками , використовуючи синтаксис Bourne, як ash
, bash
, ksh
, zsh
і любить:
cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
Однак зауважте, що з давніми, перед-POSIX оболонками Борна, будь-яка з цих команд, включаючи cat /dev/null
, не буде усікати файл, якщо він буде записаний згодом ще доданим до нього сценарієм оболонки. Замість файлу з нульовим байтом це був би розріджений файл з його розміром незмінним. Те ж саме сталося б, якщо файл записується процесом, який шукає положення, яке, на його думку, є поточним перед написанням.
Будьте також обережні, що деякі альтернативні рішення, які часто пропонують для врізання файлу, мають вади.
Обидва наступні просто не виконують завдання. Отриманий файл не порожній, але містить порожній рядок. Це порушить файли журналів, як wtmp
, наприклад , зберігають записи фіксованої ширини.
echo > file
echo "" > file
Наступний варіант, заснований на BSD- sh
опції, не є портативним, POSIX не вказує жодних дозволених параметрів для відлуння, тому, можливо, ви отримаєте файл, що містить рядок з " -n
":
echo -n > file
Той, що не є портативним, також використовуючи sh
послідовність аварійної системи System V. Деякі оболонки створять файл, що містить рядок з " \c
":
echo "\c" > file
Цей користується командою, призначеною для виконання завдання. Проблема з використанням truncate
не є портативною, оскільки ця команда, не визначена POSIX, може бути відсутня у системі Unix / Linux.
truncate -s 0
Нарешті, ось кілька альтернативних варіантів, які є портативними та належним чином виконають роботу:
Явно друкує порожній рядок у файл:
printf "" > file
Використання true
команди, яка суворо еквівалентна no-op, :
хоч і читабельніше:
true > file