réponse spécifique bash
Comme j'aime bien réduire les fourches et permettre bash beaucoup de trucs, voici mon but:
todate=2013-07-18
cond=2013-07-15
Bien maintenant:
{ read todate; read cond ;} < <(date -f - +%s <<<"$todate"$'\n'"$cond")
Cela va repeupler les deux variables $todateet $cond, en utilisant un seul fork, avec une sortie date -f -qui prend stdio pour lire une date par ligne.
Enfin, vous pourriez casser votre boucle avec
((todate>=cond))&&break
Ou en fonction :
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
}
Utiliser le script intégré de bashprintf qui pourrait rendre la date et l'heure en secondes (voir man bash;-)
Ce script utilise un seul fork.
Alternative avec fourchettes limitées et fonction de lecture de date
Cela créera un sous-processus dédié (un seul fork):
mkfifo /tmp/fifo
exec 99> >(exec stdbuf -i 0 -o 0 date -f - +%s >/tmp/fifo 2>&1)
exec 98</tmp/fifo
rm /tmp/fifo
Comme l'entrée et la sortie sont ouvertes, l'entrée fifo peut être supprimée.
La fonction:
myDate() {
    local var="${@:$#}"
    shift
    echo >&99 "${@:1:$#-1}"
    read -t .01 -u 98 $var
}
Note Afin d'éviter des fourches inutiles comme todate=$(myDate 2013-07-18), la variable doit être définie par la fonction elle-même. Et pour permettre la syntaxe libre (avec ou sans guillemets à la chaîne de données), le nom de la variable doit être le dernier argument.
Puis date de comparaison:
myDate 2013-07-18        todate
myDate Mon Jul 15 2013   cond
(( todate >= cond )) && {
    printf "To: %(%c)T > Cond: %(%c)T\n" $todate $cond
    break
}
peut rendre:
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
si en dehors d'une boucle.
Ou utilisez la fonction bash shell-connector:
wget https://github.com/F-Hauri/Connector-bash/raw/master/shell_connector.bash
ou
wget https://f-hauri.ch/vrac/shell_connector.sh
(Ce qui n'est pas exactement pareil: .shcontient le script de test complet s'il n'a pas été acheté)
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
}