Я бы сделал что-то вроде:
eval "$(#"
perl -MString::ShellQuote -00 -lne '
if (/^(.+)\n(.+)/) {
($v1, $v2, $rest) = ("sensors_$1", "$2", $'\'');
# $v1, $v2 contain the first 2 lines, $rest the rest
s/\W/_/g for $v1, $v2;
# replace non-word characters with _ in the variables
print "$v1=" . shell_quote("$1\n$2$rest");
print "${v1}__$v2=" . shell_quote("$2$rest");
# output the variable definition taking care to quote the value
while ($rest =~ /^(.*?):\s*(.*)/gm) {
# process the "foo: bar" lines in the rest
($v3,$val) = ("$1", $2);
$v3 =~ s/\W/_/g;
print "${v1}__${v2}__$v3=" . shell_quote($val)
}
}' < that-file)"
-00
для режима абзаца. -l
, чтобы удалить разделитель абзацев в конце записей и для print
, чтобы добавить его при выводе.
-n
обрабатывать ввод по одной записи за раз.
В вашем примере эта команда perl выведет следующий код оболочки:
sensors_acpitz_virtual_0='acpitz-virtual-0
Adapter: Virtual device
temp1: +41.0°C (crit = +95.0°C)'
sensors_acpitz_virtual_0__Adapter__Virtual_device='Adapter: Virtual device
temp1: +41.0°C (crit = +95.0°C)'
sensors_acpitz_virtual_0__Adapter__Virtual_device__temp1='+41.0°C (crit = +95.0°C)'
sensors_coretemp_isa_0000='coretemp-isa-0000
Adapter: ISA adapter
Core 0: +36.0°C (high = +90.0°C, crit = +90.0°C)
Core 1: +36.0°C (high = +90.0°C, crit = +90.0°C)'
sensors_coretemp_isa_0000__Adapter__ISA_adapter='Adapter: ISA adapter
Core 0: +36.0°C (high = +90.0°C, crit = +90.0°C)
Core 1: +36.0°C (high = +90.0°C, crit = +90.0°C)'
sensors_coretemp_isa_0000__Adapter__ISA_adapter__Core_0='+36.0°C (high = +90.0°C, crit = +90.0°C)'
sensors_coretemp_isa_0000__Adapter__ISA_adapter__Core_1='+36.0°C (high = +90.0°C, crit = +90.0°C)'
И мы используем eval "$ (that-perl-command)"
, чтобы указать оболочке оценить вывод этого кода с помощью эту команду.
Я бы предложил следующий сценарий, в котором я сделал несколько изменений:
filetomonitor
while true
на цикл в течение 5 часов, основываясь на поведении переменной bash SECONDS
, которая подсчитывает количество секунд с момента запуска оболочки. Это начинается с нуля, когда стартует сценарий оболочки.$(... )
форму Обновленный скрипт:
#!/bin/bash
giveup=$((5 * 60 * 60))
filetomonitor='/tmp/file-to-monitor'
ltime=$(stat -c %Z "$filetomonitor")
while [[ "$SECONDS" -lt "$giveup" ]]
do
atime=$(stat -c %Z "$filetomonitor")
if [[ "$atime" -ne "$ltime" ]]
then
echo Take action
break ## if we're only supposed to act once
ltime=$atime
fi
sleep 5
done
Я оставил break
там, но закомментировал. Если вы хотите, чтобы скрипт завершал работу (раньше, чем через 5 часов )после выполнения действия, раскомментируйте строку break
; в противном случае текущая версия сценария будет выполняться в течение 5 часов (, возможно, дольше, если действие 70 -минут начинается в 4 :59 ), возможно, вызывая действие несколько раз.