Поскольку я люблю уменьшать форки и bash допускает много трюков, есть моя цель:
todate=2013-07-18
cond=2013-07-15
Ну, а теперь:
{ read todate; read cond ;} < <(date -f - +%s <<<"$todate"$'\n'"$cond")
Это заново заполнит обе переменные $todate
и $cond
, используя только один форк, с выходом date -f -
, который принимает stdio для чтения одной даты за строкой.
Наконец, вы можете разорвать цикл с помощью
((todate>=cond))&&break
Или как функция:
myfunc() {
local todate cond
{ read todate
read cond
} < <(
date -f - +%s <<<"$1"$'\n'"$2"
)
((todate>=cond))&&return
printf "%(%a %d %b %Y)T older than %(%a %d %b %Y)T...\n" $todate $cond
}
Используя bash встроенный printf
, который может вывести время даты с секундами от эпохи (см. man bash
;-)
Этот скрипт использует только один форк.
Это создаст выделенный подпроцесс (только один форк):
mkfifo /tmp/fifo
exec 99> >(exec stdbuf -i 0 -o 0 date -f - +%s >/tmp/fifo 2>&1)
exec 98
Поскольку вход и выход открыты, запись fifo может быть удалена.
Функция:
myDate() {
local var="${@:$#}"
shift
echo >&99 "${@:1:$#-1}"
read -t .01 -u 98 $var
}
Nota Чтобы предотвратить бесполезные форки типа todate=$(myDate 2013-07-18)
, переменная должна задаваться самой функцией. А чтобы разрешить свободный синтаксис (с кавычками или без кавычек для datestring), имя переменной должно быть последним аргументом.
Тогда сравнение дат:
myDate 2013-07-18 todate
myDate Mon Jul 15 2013 cond
(( todate >= cond )) && {
printf "To: %(%c)T > Cond: %(%c)T\n" $todate $cond
break
}
может привести к виду:
To: Thu Jul 18 00:00:00 2013 > Cond: Mon Jul 15 00:00:00 2013
bash: break: only meaningful in a `for', `while', or `until' loop
если вне цикла.
wget https://github.com/F-Hauri/Connector-bash/raw/master/shell_connector.bash
или
wget https://f-hauri.ch/vrac/shell_connector.sh
(Wich не совсем одинаковые: .sh
содержат полный тестовый скрипт, если он не исходный)
source shell_connector.sh
newConnector /bin/date '-f - +%s' @0 0
myDate 2013-07-18 todate
myDate "Mon Jul 15 2013" cond
(( todate >= cond )) && {
printf "To: %(%c)T > Cond: %(%c)T\n" $todate $cond
break
}
Пакет addgroup
необходим и включен в busybox прошивки Padavan.
Выполните следующие шаги от имени пользователя root:
grep -s mlocate /etc/group || addgroup mlocate
chgrp mlocate /opt/var/mlocate
chmod g=rx,o= /opt/var/mlocate
chgrp mlocate /opt/bin/locate
chmod g+s,go-w /opt/bin/locate
touch /opt/var/mlocate/mlocate.db
chgrp mlocate /opt/var/mlocate/mlocate.db
Это однострочный (однократная команда копирования и вставки), чтобы исправить сообщение «updatedb: не удается найти группу mlocate»:
# grep -s mlocate /etc/group || addgroup mlocate;chgrp mlocate /opt/var/mlocate;chmod g=rx,o= /opt/var/mlocate;chgrp mlocate /opt/bin/locate;chmod g+s,go-w /opt/bin/locate;touch /opt/var/mlocate/mlocate.db;chgrp mlocate /opt/var/mlocate/mlocate.db
для тех, у кого нет пакета addgroup
.
вместо этого используйте эту командуsynogroup -add mlocate
grep -s mlocate /etc/group || synogroup -add mlocate
chgrp mlocate /opt/var/mlocate
chmod g=rx,o= /opt/var/mlocate
chgrp mlocate /opt/bin/locate
chmod g+s,go-w /opt/bin/locate
touch /opt/var/mlocate/mlocate.db
chgrp mlocate /opt/var/mlocate/mlocate.db