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

На этот вопрос уже есть ответ здесь:

Я начал изучать сценарии 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 cleaned. Но /var/log по-прежнему содержит все файлы.

40
задан 23 August 2014 в 19:42

5 ответов

cat перечислит содержание файла, прибывающего после того, как cat к стандартному выводу и эти > отправляет его в файл messages и wtmp, где> означает сначала удалять все содержание файла, и>> значил бы для ADD в текущий файл. В этом случае Вы используете>, таким образом, файл закончит тем, что был пуст.

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

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

38
ответ дан 16 November 2019 в 10:40

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

Перенаправление Shell

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

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 встроенный. Но jlliagre является правильным это echo -n должен избежаться для действительно портативного сценария оболочки, поскольку он не требуется, чтобы работать. Возможно, вот почему руководство, которое Вы используете, преподает cat /dev/null путь вместо этого.)

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

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

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

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

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

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

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

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

> messages
> wtmp
52
ответ дан 16 November 2019 в 10:40

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

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

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

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

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

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

cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
13
ответ дан 16 November 2019 в 10:40

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

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

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

Поэтому при выполнении команд

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

это очищает содержание "сообщений" и "wtmp" файла путем перезаписи с символом EOF(End Of File).

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

6
ответ дан 16 November 2019 в 10:40

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

Иначе они, возможно, просто использовали.

 > /var/log/messages.

существуют другие способы освободить содержание файла.

Как.

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

, Но использующий">" или "/dev/null" эффективный путь.

1
ответ дан 16 November 2019 в 10:40

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

Похожие вопросы: