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

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

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

cd /var/logcat /dev/null > messagescat /dev/null > wtmpecho "Log files cleaned up."

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

Предполагая, что команды выполнены успешно, /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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

cat /dev/null > messagescat /dev/null > wtmp

он очищает содержимое файлов "сообщения" и "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" является эффективным способом.

Я вижу в этом 1 проблему: 2-я и 3-я строки работают ТОЛЬКО при запуске от имени root. В противном случае вам нужно “sudo” перед ним.