Возможно, вы имели в виду:
export perl_script='
$| = 1;
s/\n/\r/g if $_ =~ /^AV:/;
s/Saving state/\nSaving state/'
mpv=(command mpv)
args=("$@")
sh -c '
"$@" 2>&1 |
perl -p -e "$perl_script" | tee ~/mpv_all.log
' sh "${mpv[@]}" "${args[@]}"
Или если вы хотите внедрить содержимое всех этих аргументов в виде шелл-кода:
shquote() {
LC_ALL=C awk -v q=\' '
BEGIN{
for (i=1; i<ARGC; i++) {
gsub(q, q "\\" q q, ARGV[i])
printf "%s ", q ARGV[i] q
}
print ""
}' "$@"
}
perl_script='
$| = 1;
s/\n/\r/g if $_ =~ /^AV:/;
s/Saving state/\nSaving state/'
mpv=(command mpv)
args=("$@")
sh -c "
$(shquote "${mpv[@]}" "${args[@]}") 2>&1 |
perl -p -e $(shquote "$perl_script") | tee ~/mpv_all.log"
Где shquote
заключает в кавычки свой аргумент в синтаксисе sh
(заключает аргументы в '...'
и заменяет '
на'\''
).
Поскольку вы создаете свои собственные лог-файлы и вам требуется более реальное -измельчение размера по времени, вам следует взглянуть на утилиту Apache rotatelogsздесь .
Он работает, читая стандартный ввод, и нарезает файл журнала на основе аргументов командной строки.
напр.
program-writing-to-stdout|/bin/rotatelogs /home/mike/tmp/qqq.log 1M"
logrotate , с другой стороны, проверяет файлы журналов при запуске, и обычно системы настроены на запуск logrotate (через cron )один раз в день. Конфигурация подсистем -обычно выполняется путем перетаскивания файла конфигурации в /etc/logrotate.d
, и да, обычно он запускается от имени пользователя root.
Редактировать :@mike грызун
logrotate
запускается (с помощью cron или вручную ), а затем проверяет статистику файла журнала, как показано в файловой системе -, затем запускает ротацию в зависимости от своей конфигурации.
rotatelogs
считывает стандартный ввод, непрерывно добавляя к файлу журнала, затем, когда время или размер файла журнала достигает триггерной точки -, он закрывает текущий файл журнала, создает новый файл журнала (с соответствующим именем ), затем продолжает добавляться в новый файл журнала.
Это имеет отношение к тому, как вы запускаете программу, которая генерирует выходные данные, она должна записывать в стандартный вывод, а затем вы передаете это в журналы rotatelog.
например,
while true ; do date ; sleep 30 ; done | rotatelogs -n 10 /home/mike/tmp/qqq.log 60
Дает вам круговое вращение через 10 файлов, разрезая каждые 60 секунд
Используя rclone
, я ожидаю, что --log-file "/dev/stdout"
заставит его записывать в стандартный вывод.
[править 2] @mike грызун
Я не знаком с rclone, пишет ли он в stdout или stderr, и если что-то пишет в любой из них, но есть способы обойти это, даже если --log-file=/dev/stdout
не работает.
Этот StackOverflow Q/Answer среди прочего объясняет перенаправление и конвейерную передачу. Но подводя итог, можно перенаправить только stderr или объединить с stdout в канал.
Пример Баша:
Объединить stderr с stdout в канал
FirstCommand 2>&1 | OtherCommand
Только stderr в канал, stdout в otherfile (, который может быть /dev/null или даже просто дефисом -
, который закрывает stdout ).
FirstCommand 2>&1 1>otherfile.log | otherCommand
В этих примерах используется старый синтаксис bash, bash v4 имеет современный, менее подробный вариант.