Моя цель — составить журнал команд, используемых в моих сеансах ssh, с отметками времени.
Тройник работает в режиме реального времени, пока выходные данные не фильтруются. Когда я завершаю -F test.log, следующая команда добавляет вывод в реальном времени:
#!/bin/bash
ssh "$@" | tee -a test.log
Однако, когда я пытаюсь изменить вывод tee методами, предложенными в этот вопрос, вывод больше не в реальном времени. Например:
#!/bin/bash
ssh "$@" | tee >(grep -e '.*\@.*\:.*\$.*' --color=never >> test.log)
Как ни странно, если я заменю команду «yes» вместо команды ssh, вывод будет правильно отфильтрован в реальном времени.
Обработка в реальном времени важна, потому что мой сценарий должен добавлять текущую метку времени к каждой строке и удалять как можно больше вывода. Вот мой скрипт на данный момент:
#!/bin/bash
logfile=~/test.log
desc="sshlog ${@}"
tab="\t"
format_line() {
while IFS= read -r line; do
echo "$(date +"%Y-%m-%d %H:%M:%S %z")${tab}${desc}${tab}${line}"
done
}
echo "[START]" | format_line >> $logfile
ssh "$@" | tee >(grep -e '.*\@.*\:.*\$.*' --color=never | format_line >> $logfile)
echo "[END]" | format_line >> $logfile
Как я могу это исправить, и почему команда ssh работает с tee иначе, чем команда yes?