На этот вопрос уже есть ответ здесь:
Я начал изучать сценарии 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
по-прежнему содержит все файлы.
cat
перечислит содержание файла, прибывающего после того, как cat
к стандартному выводу и эти >
отправляет его в файл messages
и wtmp
, где> означает сначала удалять все содержание файла, и>> значил бы для ADD в текущий файл. В этом случае Вы используете>, таким образом, файл закончит тем, что был пуст.
Теперь для строки над заголовком: /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
встроенный. Но 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 на пустой подсказке), и в исключении левой стороны Вы просто перенаправляете вывод той команды.
Перенаправление от пустой команды (вместо от cat /dev/null
или echo -n
) похож:
> messages
> wtmp
Как уже отвечено, эти две строки очищают содержание /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."
>
производится, перенаправляя оператор. Это перенаправит вывод команды в файл, упомянутый после него вместо устройства стандартного вывода, усекая или перезаписывая содержание файла.
, например 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
каталог, но Вы очищаете содержание этих двух файлов.
/dev/null похож на черную дыру. Отбрасываются записи, сделанные к/dev/null. В этом сценарии они используют/dev/null для освобождения файла журнала сообщений.
Иначе они, возможно, просто использовали.
> /var/log/messages.
существуют другие способы освободить содержание файла.
Как.
truncate -s 0 /var/log/messages
cp /dev/null /var/log/messages
, Но использующий">" или "/dev/null" эффективный путь.