Чтение Unix-p управляет ошибкой удара причин, как я фиксирую его?

Я просто задаюсь вопросом, почему там столько файлов журнала в типичной системе Linux?

Различные файлы журнала содержат другую информацию (хотя обычно существует некоторое дублирование). У них часто есть различные характеристики: различные политики вращения и хранения, различные полномочия, и т.д. Демон системного журнала заботится о записи их; Вы видите его настройки в /etc/syslog.conf или /etc/syslog-ng.conf.

Не был бы это быть лучшей идеей иметь одну системную функцию API для входа

Этот - хорошая идея. Давайте назовем это системным журналом. Его задание состоит в том, чтобы отправить записи в журнале демону системного журнала.

и одна объединенная таблица для сохранения всех записей в журнале из всех приложений?

Теперь это - целая куча проблем. Вы, кажется, принимаете присутствие механизма базы данных, вероятно, реляционная база данных, вероятно, один можно запросить в SQL. Но Unix является более старым, чем SQL, и существуют очень серьезные основания, почему он не принял SQL как стандартный компонент. Под Unix база данных является файловой системой. Это не реляционная база данных, это - простое. Его записи не являются строками, но простыми файлами, предпочтительно текст, предпочтительно с простым форматом. Например, файлы журнала являются текстовыми файлами, с одной записью на строку, содержа дату, название машины, инициирующую программу и текст элемента. Используя реляционную базу данных имел бы много оборотных сторон:

  • Что Вы делаете, если база данных не работает? (Файловая система является фундаментальным компонентом (и я упомянул, что это намного более просто, чем реляционная база данных?); демон системного журнала является простым компонентом, который делает одно задание (типичная функция в дизайне Unix) и так, как ожидают, сделает это хорошо и надежно.)
  • Как Вы регистрируете операции базы данных? (Хорошо, через саму базу данных — после того, как все журналы содержат записи от ядра и от демона системного журнала — но снова намного более сложная база данных делает это более трудным и менее надежным).
  • Как Вы получаете доступ к записям в журнале? Сравните простоту cat, grep, less против SQL-запросов. И полномочия файла против, ну, в общем, я не знаю, как Вы обработали бы это в типичной реляционной базе данных.
  • Установки мультисервера не хранят свои журналы локально, они используют удаленную функцию журнала, это было встроено в демона системного журнала с тех пор в значительной степени рассвет Unix. Это легко реализовать с архитектурой входа Unix; Вы не можете выполнить дублируемую базу данных по тому бюджету сложности.
1
13.09.2011, 06:47
2 ответа
if [ ! $COMMENT ]

Я думаю, что Вы означали проверять ли $COMMENT непусто, но это не то, что делает эта команда. Неупомянутая подстановка переменных подвергается поколению имени файла (globbing) и разделению слова. Здесь, Вы вводите несколько слов в свой комментарий (sun mars venus) так [ команда видит ! sun mars venus (4 аргумента), который не является допустимым синтаксисом. Всегда помещайте двойные кавычки вокруг подстановок переменных:

if [ ! "$COMMENT" ]

В данном случае это тестирует ли $COMMENT непусто. Это - ярлык, потому что существует только два слова оболочки в скобках. В общем случае способ протестировать, непуста ли строка, состоит в том, чтобы использовать -n оператор, и -z оператор тестирует, пуста ли строка.

if [ -z "$COMMENT" ]

В ksh/bash/zsh можно использовать [[ … ]] создайте вместо [ … ] команда. Одиночные скобки являются обычной командой, связанной обычными синтаксическими правилами оболочки, тогда как двойные скобки являются специальным синтаксисом оболочки с его собственными правилами. В двойных скобках нет никакого разделения слова, таким образом, можно записать

if [[ -z $COMMENT ]]

Двойные кавычки не причинили бы боль все же.

То же идет для if [ ! $1 ] который должен быть if [ -z "$1" ] или if [[ -z $1 ]].

Существует дополнительная причуда, которую Вы экспортируете COMMENT переменная к среде, когда комментарий передается как аргумент функции, но не при чтении его с read встроенный. Если Вы не должны передавать COMMENT к внешней программе отбросьте слово export.

6
27.01.2020, 23:13

Bash интерпретирует[ как test команда (который требует пробелов вокруг аргумента). Посмотрите Wiki Greg на тестах и условных выражениях...

1
27.01.2020, 23:13
  • 1
    [ в заключенной в кавычки строке, поэтому как она может быть интерпретирована как test команда? –  enzotib 12.09.2011, 22:04
  • 2
    На основе кода, если, и сообщение об ошибке, которое является единственным выводом, который я могу сделать. –  jasonwryan 12.09.2011, 22:47
  • 3
    я обновил свое сообщение, надо надеяться, существует достаточно информации там теперь для ответа –  qodeninja 13.09.2011, 06:52
  • 4
    Необходимо использовать кавычки в Вашем test - иначе слова разделяются, и удар видит больше чем один аргумент в пользу test См.: mywiki.wooledge.org/Quotes –  jasonwryan 13.09.2011, 07:16

Теги

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