Что означает /dev/null в сценарии оболочки?

Предполагая, что команды выполнены успешно, /var/log/messages и /var/log/wtmp все еще существуют, но теперь пустой.

Перенаправление оболочки

> это оператор перенаправления, реализованный оболочкой. Его синтаксис таков:

команда>  файл

Это перенаправляет commandстандартный выходной сигнал к file.

  • file может также быть узел устройства.
  • Если file не существует, он создается как обычный файл.
  • Если file уже существует как обычный файл и не является пустым, он перезаписывается. Обычно это имеет место в командах, которые вы выполняли, когда вы перенаправляли вывод cat /dev/null к messages и wtmp.
  • Если file уже существует как символическая ссылка, используется цель ссылки.
  • Если file уже существует как каталог, вы получите сообщение об ошибке типа bash: файл: Является каталогом.

(Конечно, эти операции могут завершиться неудачей по другим причинам, таким как отсутствие разрешения или ошибка файловой системы.)

То >> оператор перенаправления аналогичен, но он добавляет в конец непустых обычных файлов вместо перезапись их содержание. (Другим оператором перенаправления является <. команда < файл использует file как commandстандартный ввод.)

То null Устройство

/dev/null это простое устройство (реализованное в программном обеспечении и не соответствующее ни одному аппаратному устройству в системе).

  • /dev/null выглядит пустым, когда вы читаете из него.
  • Пишу в /dev/null ничего не делает: данные, записанные на это устройство, просто "исчезают".

Часто стандартный вывод команды отключается путем перенаправления его на /dev/null, и это , пожалуй, самый null наиболее распространенное использование устройства в сценариях оболочки:

команда>  /dev/null

Ты используешь /dev/null иначе. cat /dev/null выводит "содержимое" /dev/null, то есть его выходные данные пусты. > messages (или > wtmp) приводит к перенаправлению этого пустого вывода в файл в правой части > оператор.

С messages и wtmp являются обычными файлами (а не, например, узлами устройств), они превращаются в пустые файлы (т.е. очищаются).

Вы можете использовать любую команду, которая ничего не делает и не выдает никаких выходных данных, слева от >.

Альтернативным способом очистки этих файлов было бы запустить:

echo -n > messagesecho -n > wtmp

То -n флаг является обязательным, или echo пишет новая строка характер.

(Это всегда работает в bash. И я верить значение по умолчанию sh в каждом дистрибутиве GNU /Linux и других Unix-подобных системах, широко используемых сегодня, поддерживается -n флаг в его echo встроенный. Но джиллиагр прав тот echo -n следует избегать использования действительно переносимого сценария оболочки, поскольку он не требуется для работы. Может быть, именно поэтому руководство, которым вы пользуетесь учит тому, cat /dev/null путь вместо этого.)

То echo -n способ эквивалентен по своим эффектам, но, возможно, является лучшим решением, поскольку он проще.
cat /dev/null > файл открывает три "файла":

  • То cat исполняемый файл (обычно /bin/cat), обычный файл.
  • То /dev/null устройство.
  • file

В отличие от, echo -n > файл открывается только file (echo является встроенной оболочкой).

Хотя следует ожидать, что это улучшит производительность, это не является преимуществом - во всяком случае, не при простом выполнении пары этих команд вручную. Вместо этого преимущество заключается в том, что легче понять, что происходит.

Перенаправление и тривиальная (пустая/пустая) команда.

Как Джиллиагр указал на (см. также ответ Джиллиагра), это можно сократить еще больше, просто опустив команду слева от > в целом. В то время как вы не можете опустить правую часть > или >> выражение, пустая команда действительна (это команда, которую вы выполняете, когда просто нажимаете Enter в пустой строке), и, опуская левую часть, вы просто перенаправляете вывод этой команды.

  • Обратите внимание, что этот вывод делает нет содержать новую строку. Когда вы нажимаете Enter в командной строке - независимо от того, ввели вы что-либо или нет - командная оболочка (работающая в интерактивном режиме) выводит новую строку перед выполнением выданной команды. Эта новая строка не является частью выходных данных команды.

Перенаправление из пустой команды (вместо из cat /dev/null или echo -n) выглядит как:

&gt messages&gt wtmp