Le trap devrait être avant la boucle. Un seul suffit.
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 \nlinefeed).
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.
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).
Y’a moyen d’éviter les basheries et de faire du POSIX. Pour les extensions je teste
"${path%.flac}" != "$path"
awk est overkill, pour faire un cut -f1
-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.
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 arecordkill -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;doprintf'\r%s - %s'`du -sh ... |cut -f1`"`elapsed_time`" >&2;done
# Remarques
Posté par xshell . En réponse au message Wrapper for ALSA recording of playback device. Évalué à 2. Dernière modification le 06 octobre 2023 à 18:35.
trapdevrait être avant la boucle. Un seul suffit.sleepet faire sauter « a_period_passed ». Et tu mets à jours toutes les secondes sans manger de ligne (pas de caractère\nlinefeed).arecordcaptureSIGINTqui est retransmis au process du groupe du shell (tous les processus fils qui ont leurPGIDégal auPIDdu 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 (unsleepà la place duarecordn’est pas interrompu chez moi et continue à tourner en tâche de fond — rattaché auPID 1, lorsque le scriptexit). D’un autre côté la solution "propre" me paraît singulièrement compliquée./tmp/$$-1ドルen lieu et place d’unmktemptu ne devrais pas, pour éviter les I/O inutiles passer partmp. Lors desmvil faut privilégier les déplacements dans le même répertoire, pour rester sur le même filesystem (en protégeant parmv -n ... || exit 1afin de ne rien écraser par inadvertance — l’option est très probablement robuste sur Linux car il suffit d’un appel C àrenameat2avecRENAME_NOREPLACE, mais pas en standard POSIX — faut passer par unmkdirdans ce cas)."${path%.flac}" != "$path"awkest overkill, pour faire uncut -f1-epour tester l’existence d’un fichier, pas-f. L’intention est louable mais casse-gueule (l’utilisateur peut créer un fichier entre letestet learecord). Encore une foismktemp -p,mv -n, oumkdirfournissent les garanties nécessaires.PATH="1ドル"(par exemple). Ça auto-documente les arguments de la ligne de commande.