Нет, bash не кэширует вывод команд, так как вывод может меняться от запуска к запуску; bash не имеет надежного -огневого способа отследить, был ли файл изменен другим процессом, что было бы критически важно, чтобы bash
можно было определить, действителен ли его кешированный результат или нет.
Однако тут дело в другом. Когда вы используете оболочку (, такую как bash
), вы одновременно взаимодействуете с несколькими частями системы. Например:
libc
, которая время от времени может вызывать запутанное поведение практически в любой программе. В этом случае, я бы сказал, что самый большой вклад вносит не bash
сам по себе, а механизм кэширования на уровне файловой системы -, реализованный в ядре. После того как вы прочитали файл один раз, большая его часть может оказаться в кеше файловой системы, который представляет собой кусок памяти, зарезервированный для этой цели.
При повторном выполнении операций над файлом оболочка не запускает повторно чтение физического оборудования, а извлекает содержимое файла из кэша. Почти любая операция, которую вы (и )выполняете в bash, будет чрезвычайно быстрой по сравнению с чтением с диска. Вот почему вы не замечаете, что bash на самом деле повторно -выполняет команды, потому что отсутствует медленное чтение с диска.
Не знаю, как вы собираетесь использовать (
и )
с операторами bash , однако это сработает:
if [ 0142 -ge 0045 ] && [ 0142 -lt 0130 ]; then
echo "yep"
fi
Если это не то, что вам нужно, вставьте как можно больше релевантного кода.
Как указано в комментариях ниже, это действительно вызовет проблемы, поскольку сравнивает восьмеричные числа с (в конце концов после 10:00 )десятичными числами
Я бы рекомендовал использовать date
для преобразования времени в секунды, а затем сравнить это.
Примером может быть:
# grab these however you are currently
time1="01:42"
time2="00:45"
time3="01:42"
time4="01:30"
time1Second=$(date -d "${time1}" +%s)
time2Second=$(date -d "${time2}" +%s)
time3Second=$(date -d "${time3}" +%s)
time4Second=$(date -d "${time4}" +%s)
# then your comparison operators and logic:
if [ "$time1Second" -ge "$time2Second" ] && [ "$time3Second" -lt "$time4second" ]; then
# logic here
echo true
fi
Таким образом, вы всегда сравниваете числа по одному и тому же основанию
Преобразуйте время в минуты и сравните их
startTime=00:45
fileTime=01:42
hr=${startTime/:*} mn=${startTime/*:} # Split hh:mm into hours and minutes
startMins=$(( ${hr#0} * 60 + ${mn#0} )) # Minutes since midnight
hr=${fileTime/:*} mn=${fileTime/*:}
fileMins=$(( ${hr#0} * 60 + ${mn#0} ))
if [[ $fileMins -ge $startMins ]]; then :...; fi