Что означает /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" является эффективным способом.