Что я делаю для такого рода вещей, так это меняю значение PS1
, когда я меняю каталоги. Это тривиально в zsh, который выполняет команду chpwd
; это можно сделать в bash, определив оболочки для cd
и друзей .
cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
if git rev-parse --show-toplevel 2>/dev/null >/dev/null; then
PS1='$ \w $(__git_ps1): '
else
PS1='$ \w: '
fi
}
Это можно сделать с помощью inotifywait с однострочным текстом:
inotifywait -e move_self -e modify -m /path/to/some/file | awk '$2=="MODIFY" {system("/bin/echo Yes")}'
Флаг -m сохраняет мониторинг файла на неопределенный срок, для событий move_self (что позволяет отслеживать изменение имени файла или каталога) и modify , передавая вывод в команду awk который отсеивает события move_self , выполняя команду внутри набора скобок системы для каждого события модификации . Вам придется написать свой собственный сценарий оболочки вместо моей команды echo . Обратите внимание на различные наборы апострофов и кавычек.
inotify
используется для мониторинга файлов и каталог по их иноду, а не по имени. Когда файл вращается, его содержимое больше не изменяется (за исключением короткого периода, пока демоны не будут перезагружены, чтобы они использовали вновь созданный файл журнала)
AFAIK, tail -f
использует система inotify, так что это не поможет.Но если у вас есть рабочее решение с tail -f
, используйте tail --follow = name
(или tail -F
), если это поддерживается вашей версией. of tail
(POSIX tail не поддерживает это). tail
затем будет отслеживать файл, идентифицированный его именем файла. Вот отрывок из справочной страницы:
С --follow (-f) хвост по умолчанию следует за файловым дескриптором, что означает, что даже если хвостовой файл переименован, хвост будет - продолжить, чтобы отследить его конец. Такое поведение по умолчанию нежелательно, если вы действительно хотите, чтобы отслеживал фактическое имя файла, а не дескриптор файла (например, ротацию журнала). В этом случае используйте --follow = name. Это заставляет tail отслеживать именованный файл таким образом, чтобы его можно было переименовать, удалить и создать.
[update]
Пример использования:
tail -n0 -F my_file.log \
| while read -r log_line; do
do_something_with "$log_line"
done
Из-за конвейера цикл while выполняется в под- процесс, который может вызвать проблемы, если вы захотите изменить переменные вне цикла. Если вы используете bash
, вы можете использовать этот альтернативный синтаксис, который не имеет этого нежелательного эффекта (но менее читабелен):
while read -r log_line; do
do_something_with "$log_line"
done < <(tail -n0 -F my_file.log)