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

Я начал изучать сценарии bash, используя это руководство: http://www.tldp.org/LDP/abs/abs-guide.pdf

Однако я застрял на первом сценарии:

cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "Log files cleaned up."

Что делают строки 2 и 3 в Ubuntu (я понимаю cat)? Это только для других дистрибутивов Linux? После запуска этого скрипта от имени root, я получаю вывод Log files cleaned up. Но /var/log по-прежнему содержит все файлы.

5 ответов

Решение

cat будет перечислять содержимое файла после cat к стандартному выводу и тому > отправляет его в файл messages а также wtmp где> означает сначала удалить все содержимое файла, а >> означает ДОБАВИТЬ в текущий файл. В этом случае вы используете>, поэтому файл окажется пустым.

Теперь для кикера: /dev/null это устройство, которое отправляет "ничего" 2 файлам за>.

Есть причина сделать это так: файл НЕ удаляется из системы. Если бы вы rm это, а затем сделать touch messages разрешения могут быть неправильными, и если сразу после rm что-то захочет записать в файл, оно исчезнет и произойдет ошибка. В зависимости от того, как создается программное обеспечение, оно может зависнуть.

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

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

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

command > file

Это перенаправляет command стандартный вывод на file,

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

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

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

null устройство

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

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

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

command > /dev/null

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

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

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

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

echo -n > messages
echo -n > wtmp

-n флаг требуется, или echo пишет символ новой строки.

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

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

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

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

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

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

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

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

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

> messages
> wtmp

Как уже ответили, эти две строки очищают содержание /var/log/messages а также /var/log/wtmp файлы, или создаете их в том маловероятном случае, если они еще не существуют.

Тем не менее, они основаны на хорошо известной городской легенде, которая дает /dev/null "паранормальные" силы.

На самом деле нет так cat /dev/null это пустая трата нажатий клавиш, времени и циклов ЦП, поскольку она абсолютно ничего не выводит. Ответ Элии Каган предлагает лучший подход, который использует echo -n вместо. Это лучше, но не переносимо на некоторые оболочки / операционные системы, где можно поставить-n'строка в эти файлы.

Вы можете пойти дальше и заменить эти команды переносимыми и более простыми:

cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."

С большинством снарядов (но не csh на основе), вы можете пойти еще дальше и удалить команду no-op ':':

cd /var/log
> messages
> wtmp
echo "Log files cleaned up."

> является оператором перенаправления вывода. Он перенаправит вывод команды в файл, указанный после него, вместо стандартного устройства вывода, обрезая или перезаписывая содержимое файла.

например ls -l > demo.txt, После выполнения этой команды "demo.txt" будет содержать выходные данные ls -l команда.

Теперь следующее, что это /dev/null,/dev/null является нулевым файлом? Это специальный файл, который ничего не содержит.

Поэтому, когда вы выполняете команды

cat /dev/null > messages
cat /dev/null > wtmp

он очищает содержимое файлов "messages" и "wtmp", перезаписывая символ EOF(конец файла).

Так что здесь вы не очищаете свой /var/log каталог, но вы очищаете содержимое этих двух файлов.

/dev/null похож на черную дыру. Записи, сделанные в /dev/null, отбрасываются. В этом сценарии они используют /dev/null для очистки файла журнала сообщений.

В противном случае они могли бы просто использовать.

 > /var/log/messages.

Существуют и другие способы очистки содержимого файла.

Подобно.

     truncate  -s  0  /var/log/messages
     cp  /dev/null  /var/log/messages

Но использование ">" или "/dev/null" является эффективным способом.

Другие вопросы по тегам