Конец комментариев в первой новой строке (см. маркерное правило 10 распознавания оболочки), не позволяя строки продолжения, таким образом, этот код имеет foo
в отдельной командной строке:
echo # this is a comment \
foo
Что касается Вашего первого предложения, обратная косая черта не сопровождается новой строкой, Вы просто заключаете пространство в кавычки: это эквивалентно
echo ' # this is a comment'
foo
$(: this is a comment)
заменяет выводом команды : this is a comment
. Если вывод той команды пуст, это - эффективно очень запутывающий способ вставить комментарий посреди строки.
Нет никакого волшебного продолжения: :
обычная команда, утилита двоеточия, которая ничего не делает. Утилита двоеточия главным образом полезна, когда синтаксис оболочки требует команды, но Вам, оказывается, нечего делать.
# Sample code to compress files that don't look compressed
case "$1" in
*.gz|*.tgz|*.bz2|*.zip|*.jar|*.od?) :;; # the file is already compressed
*) bzip2 -9 "$1";;
esac
Другой вариант использования является идиомой для установки переменной, если это уже не установлено.
: "${foo:=default value}"
Комментарий о goto является историческим. Утилита двоеточия датируется от даже перед Оболочкой Bourne, полностью к оболочке Thompson, которая имела goto инструкцию. Двоеточие затем означало маркировку; двоеточие является довольно общим синтаксисом для маркировок goto (оно все еще присутствует в sed).
Вот беглый сценарий, который сделает то, в чем Вы нуждаетесь:
#!/bin/bash
LOGDIR=/var/log/somedir
OLDLOGS=/var/log/keep-old-logs-here
PATH=/bin:$PATH
TODAY=$(date +'%Y%m%d')
[ -d $OLDLOGS ] || mkdir -p $OLDLOGS
cd $LOGDIR
for LOG in $(ls | egrep '^[[:digit:]]{8}$'); do
[ $LOG -lt $TODAY ] && gzip $LOG && mv $LOG.gz
done
Сделайте исполняемый файл сценария:
$ chmod +x /where/you/put/this/script
crontab запись будет похожа:
30 0 * * * /where/you/put/this/script
Просто корректируйтесь LOGDIR
и OLDLOGDIR
. В 0:30 это переместится, все входит в систему формат YYYYMMDD для предыдущего (и ранее, если таковые имеются) дни.
logrotate
самостоятельно не делает этого. Я рекомендовал бы писать дополнительный сценарий и вызвать его от logrotate
использование postrotate
опция в конфигурации.
logrotate может сделать это с olddir, если Ваше имя файла журнала является тем же каждым разом, когда это работает, и можно добавить даты. Если Ваши смены имени файла журнала т.е. YYYYMMDD затем logrotate не сделают этого для Вас.
# sample logrotate conf file
copytruncate
compress
dateformat %Y%m%d.
dateext
extension log
olddir ./logarchive
/logs/sys.log {
rotate 7
daily
}
Копии и gzips /logs/sys.log к/logs/logarchive/sys.20120101.log.gz, сохраняет одну недельную ценность журналов.
nodateext
,olddir
,compress
, иdaily
опции. большое спасибо – unpythonic 24.06.2011, 14:26