• # Remarques

    Posté par . En réponse au message Wrapper for ALSA recording of playback device. Évalué à 2. Dernière modification le 06 octobre 2023 à 18:35.

    1. Le trap devrait être avant la boucle. Un seul suffit.
    2. L’affichage du temps passé me paraît inutilement compliqué et le modulo sans intérêt. On peut se contenter de réactualiser l’affichage toutes les n secondes avec un simple sleep et faire sauter « a_period_passed ». Et tu mets à jours toutes les secondes sans manger de ligne (pas de caractère \n linefeed).
    3. arecord capture SIGINT qui est retransmis au process du groupe du shell (tous les processus fils qui ont leur PGID égal au PID du shell), ça explique pourquoi il s’arrête. Mais dans le cas général ce n’est pas garanti, et c’est un peu perturbant de ne pas avoir un arrêt explicite (un sleep à la place du arecord n’est pas interrompu chez moi et continue à tourner en tâche de fond — rattaché au PID 1, lorsque le script exit). D’un autre côté la solution "propre" me paraît singulièrement compliquée.
    4. Nonobstant le très moche /tmp/$$-1ドル en lieu et place d’un mktemp tu ne devrais pas, pour éviter les I/O inutiles passer par tmp. Lors des mv il faut privilégier les déplacements dans le même répertoire, pour rester sur le même filesystem (en protégeant par mv -n ... || exit 1 afin de ne rien écraser par inadvertance — l’option est très probablement robuste sur Linux car il suffit d’un appel C à renameat2 avec RENAME_NOREPLACE, mais pas en standard POSIX — faut passer par un mkdir dans ce cas).
    5. Y’a moyen d’éviter les basheries et de faire du POSIX. Pour les extensions je teste "${path%.flac}" != "$path"
    6. awk est overkill, pour faire un cut -f1
    7. -e pour tester l’existence d’un fichier, pas -f. L’intention est louable mais casse-gueule (l’utilisateur peut créer un fichier entre le test et le arecord). Encore une fois mktemp -p, mv -n, ou mkdir fournissent les garanties nécessaires.
    8. J’aime bien en début de shell faire : PATH="1ドル" (par exemple). Ça auto-documente les arguments de la ligne de commande.
    stop_job() {
     # on préfère SIGHUP qui ne provoque pas un retour d’erreur de la part de arecord
     kill -s SIGHUP $job && wait
     post_process_record
     exit $RC
    }
    # setsid permet de détacher la session du arecord de la session du shell
    # en conséquence le shell n’envoie plus SIGINT à arecord lorsque l’utilisateur saisit ^C
    setsid arecord $REC_ARG &
    job=$!
    trap stop_job SIGINT
    while sleep 10; do printf '\r%s - %s' `du -sh ... |cut -f1` "`elapsed_time`" >&2; done