URL: https://linuxfr.org/forums/programmation-shell/posts/pas-trouver-fichier Title: Pas trouver fichier Authors: Marotte ⛧ Date: 2024年08月08日T03:52:17+02:00 License: CC By-SA Tags: bash Score: 4 Hello, J’ai une question à la con, tellement à la con que je ne pourrais trouver le sommeil sans avoir au moins un indice. Voici le code que j’ai (j’ai volontairement "anonymisé" le nom des variables pour que ce soit plus générique). Ce que fait le `grep` n’a pas grande importance, l’idée c’est que je ne traite que certaines lignes de chaque fichier. Le point important c’est de traiter les fichiers dans l’ordre chronologique, d’où les options `-rt` passées à `ls`. ```bash declare -a files=($(ls -rt "${@}")) shift "${#files[@]}" for line in $(grep -Eh '^<' "${files[@]}" | tr -d '\\'); do echo "${program} ${line} ${global_var}" "${@}">&2 eval "${program} ${line} ${global_var}" "${@}" done ``` Alors voilà l’idée, le script est appelé avec comme arguments un nombre arbitraire de fichiers, potentiellement des "globs" (ie: plop*.foo) qui se développeront donc eux-mêmes en un nombre imprévisibles d’arguments. Ce que je voudrais faire, et qui me semble de plus en plus con en avançant dans la rédaction de ce post, c’est que les arguments restant qui ne sont pas des fichiers puissent se retrouver dans "${@}", pour être passés à la commande qui est lancée dans la boucle `for` pour les lignes dans chaque fichier. D’où le `shift` du nombre d’éléments du tableau "files", correspondant au nombre de fichiers que le globbing aura généré. Je précise que j’assume que tous les arguments qui sont des fichiers sont en premiers, et ceux à reporter se trouvent tous à la suite. Pas d’intrication entre les deux. Le « problème » que j’ai, c’est que la commande `ls` va forcément se plaindre que les arguments qui ne sont pas des fichiers, et bien, n’en sont pas (forcément \_o\_). Et quelque part ça me gêne. Mais j’ai du mal à voir où. Car en effet, il suffit qu’un seul argument soit bien un fichier (ou un "glob") pour que l’affectation d’un élément au tableau "files" soit un succès, faisant qu’ainsi même avec l’option `errexit` ça ne pose aucun problème. Et je sais qu’un simple `2>/dev/null` sur le `ls` ôterait ces vilains messages de ma vue me permettant d’oublier que je fais du mal à un utilitaire du shell mais il y a quelque chose qui me gêne. À priori j’aurais le même genre de soucis avec find/xargs/sort, et le problème est peut-être de me cantonner à des arguments positionnels (ie: pas de getopts), mais j’ai une raison pour ça dans ce cas précis (qui n’est pas le sujet du post en l’occurrence). Une piste éventuelle que j’ai serait de tester chaque argument pour savoir s’il désigne un ou plusieurs fichiers, et ne passer à `ls` que ces arguments, mais je suis vraiment pas sûr que ce soit optimal. D’aucun ne manqueront pas de penser que je suis masochiste à utiliser Bash de cette façon (voir tout court \^\^), ou que quand on peut mettre un `2>/dev/null` tout simple faut vraiment être tordu pour se poser ce genre de question, ou encore que « eval c’est le mal » ou « les arguments positionnels LOL! » , et bien qu’ils n’hésitent pas à me faire part de leur avis, ce sera sans doute constructif comme toujours. (non désolé je n’ai pas d’aspirine)

AltStyle によって変換されたページ (->オリジナル) /