Файлы могут быть очищены с помощью cat /dev/null > filename
. Действительно ли это - тот же специальный файл, который работает каждый раз, когда cat > filename
сделан?
Короткий ответ Нет.
Это два различных метода Очистки использования текстового файла cat /dev/null > file
и cat > file
сопровождаемый Ctrl + C.
Перенаправление >
используется для перенаправления вывода в некоторый файл. Например, date
покажет текущее время и дату на станд.
$ date
Sat Jul 25 20:56:09 IST 2015
Если Вы используете,
$ date>/path/to/file
Затем это перенаправит stdout
кому: file
.
$ cat /path/to/file
Sat Jul 25 20:56:23 IST 2015
Как cat /dev/null>file
очищает содержание файла
Это просто перенаправляет содержание пустого устройства /dev/null
в файл. Таким образом, содержание перезаписывается, и это становится пустым.
Как cat > file
очищает содержание файла
cat
Свяжите файл (файлы) или стандартный вход, к стандартному выводу. Возьмите следующий пример,
$ cat
some text # by user on stdin
some text # stdin to stdout concatenated by cat
some other text # by user on stdin
some other text # stdin to stdout concatenated by cat
^C # Ctrl+C to terminate.
Команда cat > file
будет ожидать stdin и перенаправит и перезапишет файл. Это должно быть остановлено с помощью Ctrl + C.
Если Вы ничего не вводите в stdin и завершаете процесс с SIGINT (Ctrl+C
) это перезапишет файл с пробелом.
Следующий пример там для большего количества разъяснения:
$ cat > file
some text
some other text
^C
$ cat file
some text
some other text
Никакой специальный файл не имеет полезной цели ни в одном случае.
cat /dev/null
точно не, эта команда не делает абсолютно ничего из интереса, и это может быть заменено любой командой, которая ничего не производит.
можно, например, очистить содержание файла с любой из этих команд:
printf > filename
true > filename
: > filename
или даже, со многими оболочками, при помощи никакой команды вообще, но перенаправления:
> filename
, С другой стороны:
cat > filename
перенаправляет stdin
, т.е. все, что Вы вводите на своей клавиатуре к имени файла. Если бы Вы прерываете эти cat
команда прежде, чем ввести что-нибудь, результатом также был бы пустой файл, но это - довольно неэффективный метод, чтобы сделать это.
Нет, что очищается, файл не /dev/null
, но >
перенаправление, которое внутренне усекает сам выходной файл прежде, чем перенаправить вывод cat
.
cat /dev/null > filename
: Вы открываетесь /dev/null
и печать его "содержания" (ничто) к stdout
; одновременно дескриптор файла для filename
открыт, файл усеченный и stdout
из cat
перенаправляется к нему (следовательно, ничто на самом деле не перенаправляется в файл),cat > filename
: Вы ничего не печатаете к stdout
, потому что Вы не указываете файл, и Вы даже не являетесь передающими stdin
(который имеет эффект создания cat
ожидание undefinetly); одновременно дескриптор файла для filename
открыт, файл усеченный и stdout
из cat
перенаправляется к нему (следовательно, ничто на самом деле не перенаправляется в файл),Они делают точно то же самое (с точки зрения очистки файла), но первое открывает дополнительный дескриптор файла по сравнению со вторым, и второе будет ожидать undefinetly чего-то для входа cat
stdin
.
Методы, эквивалентные первому (и второму мудрому результатом, но без стычки ожидания undefinetly cat
) был бы:
$ echo -n | cat > file # empty pipe
$ <emptyfile cat > file # empty file
$ <<<'' cat > file # empty herestring
$ <<EOF cat > file
>EOF # empty heredoc