Одна из вероятных причин кажущейся разницы в выводе ls -l
между zsh и bash - это использование Tab
-дополнение с включенным AUTO_REMOVE_SLASH
в zsh (значение по умолчанию ).
AUTO_REMOVE_SLASH
Когда последний символ, полученный в результате завершения, представляет собой косую черту, а следующий набранный символ представляет собой разделитель слов, косую черту или символ, завершающий команду (например, точка с запятой или амперсанд) удалите косую черту.
При вводе ls -l symb
Tab оба zsh
и bash
завершат это до ls -l symboliclink /
] (обратите внимание на /
в конце). Разница в том, что zsh
(с включенным AUTO_REMOVE_SLASH
) удалит косую черту, если вы просто нажмете Enter (т.е. завершите команду).
Таким образом, вы эффективно запустите ls -l symboliclink /
в bash , который сообщает ls -l
искать ссылку.Но в zsh вы запустите ls -l symboliclink
, который сообщает ls -l
, что вы хотите видеть информацию о ссылке, а не о целевом каталоге.
ls
без опции -l
всегда будет показывать содержимое целевого каталога, независимо от того, есть ли /
в конце или нет.
Чтобы zsh не удалял косую черту в конце, достаточно просто ввести ее явно после завершения TAB
. Обычно это не приводит к видимому изменению заполненного текста, но если вы введете пробел или подтвердите команду, /
останется. «Обычно», потому что можно установить выделение для автоматически добавляемых символов суффикса, например пурпурного и полужирного:
zle_highlight[(r)suffix:*]="suffix:fg=magenta,bold"
( Примечание: это может не работать при использовании внешнего ZSH плагина подсветки синтаксиса )
Другое решение (очевидно) - отключить AUTO_REMOVE_SLASH
. Это можно сделать с помощью
setopt noautoremoveslash
Отличные идеи, самое простое - это предложение @MelBurslan о различии файлов.
#!/bin/sh
MAILTO=user@email.com
OFILE=/var/tmp/alerts.tmp
LOG30=/var/tmp/LOG30
LOGNOW=/var/tmp/LOGNOW
HOST=`hostname`
# setup file
if [ -f ${OFILE} ]; then
cat /dev/null > ${OFILE}
else
touch ${OFILE}
fi
cat /var/log/logfile.log | egrep -i "error|warning" | tee -a ${LOGNOW}
diff ${LOG30} ${LOGNOW} | tee -a ${OFILE}
if [ -f ${OFILE} ]; then
echo "Errors" | cat - ${OFILE} > temp && mv temp ${OFILE}
mailx -r root@server.com -s "Errors" ${MAILTO} < ${OFILE}
fi
rm ${LOG30}
mv ${LOGNOW} /var/tmp/LOG30
rm ${OFILE}
Для преобразования в эпоху можно использовать следующий оператор:
# date +%s -d"Aug 1, 2016 2:15:29 PM MDT"
1470082529
Для преобразования эпохи в UTC можно использовать:
# date -d @1470082529
Tue Aug 2 00:45:29 IRDT 2016 #### on Linux Box
# date -r 1470082529
Tue Aug 2 00:45:29 IRDT 2016 ###on BSD box
Я бы использовал модуль perl
File::Tail
. У меня сейчас нет времени писать пример, но в псевдокоде perlish это будет выглядеть примерно так:
#! /usr/bin/not-actually-perl
use strict;
use File::Tail;
use Net::SMTP or Mail::Mailer or one of the squillion other
perl mail sending modules;
open a File::Tail file handle to your log file
my $now=time();
my @lines = ();
while (read the File::Tail handle) {
push @lines, $_;
if (time() > ($now + 1800 seconds) ) {
$now=time();
email the @lines array to you@your.address;
@lines=();
}
}
Реально работающий скрипт, вероятно, будет меньше чем на 10 строк длиннее, чем приведенный выше, и большая его часть - это настройка заголовков для электронной почты.
и еще несколько строк для отлова различных сигналов, чтобы отправить по электронной почте то, что у него есть сейчас в @lines перед приостановкой или выходом.
Точные подробности см. в man-страницах для File::Tail
и Net::SMTP
(или любой другой).