• [^] # Re: changer la maniere de faire

    Posté par . En réponse au message J'ai une colle pour les experts shell ou système.. Évalué à 1.

    Bonjour la "cantonnade" comme promis je poste la solution que j'ai trouvé :-) et si ça peut aider quelqu'un à jour...

    Pour rappel mon soucis provenait du fait de la disparition d'un fichier qui est en paramètre de la commande ci-dessous :

    stat -c %y $file | sed s/\\..*$//

    Cette commande est sensée retourner l'heure de création du fichier. Mais encore une fois si le fichier a disparu la commande stat va se planter !

    • Phase 1 - J'isole le problème éventuel de la disparition du fichier.
    stat -c %y $file 2>/dev/null | sed s/\\..*$//
    • Phase 2 - Je traite le fait que cette commande peut ne rien renvoyer si le fichier a disparu. Dans ce cas-ci, j'aurai besoin qu'on me renvoie now. Pour cela, j'utilise la commande ifne dont une implémentation shell pourrait être la suivante.
    ifne () { read line && echo ${line:-$(eval "$@")} || eval "$@" ; }

    Cette commande est programmée pour recevoir en entrée un flot :
    * si ce flot n'est pas nul, elle l'affiche via un echo
    * Si ce flot est nul ou s'il y a un problème en entrée elle évaluera l'ensemble des paramètres comme une seule instruction.

    Dans mon contexte cela devient :

    stat -c %y $file 2>/dev/null | sed s/\\..*$// | ifne echo now

    Maintenant l'insertion totale dans ma condition décrite précédemment :

    ...
    IGNORE_TIME=1
    # Test qui va marcher à tous les coups même si $file est vide...
     [[ $File =~ ^regexp_qui_valide_name_file$ ]] && (( $(diff_date now "$(stat -c %y $file 2>/dev/null | sed s/\\..*$// | ifne echo now)" m) > $IGNORE_TIME )) && {
     ...
     # Prise en charge du fichier
     ...
     }

    Et voili, voilà ça marche comme un charme. J'avoue ça donne un peu le torticolis :-)

    Merci encore aux différentes participations même si c'est moi qui est trouvé la soluce ;-)