J'ai un script qui analyse les noms de fichiers dans un tableau en utilisant la méthode suivante tirée d' un Q&A sur SO :
unset ARGS
ARGID="1"
while IFS= read -r -d $'\0' FILE; do
ARGS[ARGID++]="$FILE"
done < <(find "$@" -type f -name '*.txt' -print0)
Cela fonctionne très bien et gère parfaitement tous les types de variations de noms de fichiers. Parfois, cependant, je passe un fichier inexistant au script, par exemple:
$ findscript.sh existingfolder nonexistingfolder
find: `nonexistingfile': No such file or directory
...
Dans des circonstances normales, je voudrais que le script capture le code de sortie avec quelque chose comme RET=$?
et l'utilise pour décider comment procéder. Cela ne semble pas fonctionner avec la substitution de processus ci-dessus.
Quelle est la procédure correcte dans des cas comme celui-ci? Comment capturer le code retour? Existe-t-il d'autres moyens plus appropriés pour déterminer si quelque chose s'est mal passé dans le processus de substitution?
la source
Utilisez un coprocessus . À l'aide de la fonction
coproc
intégrée, vous pouvez démarrer un sous-processus, lire sa sortie et vérifier son état de sortie:Si le répertoire n'existe pas,
wait
quittera avec un code d'état différent de zéro.Il est actuellement nécessaire de copier le PID dans une autre variable car
$LS_PID
il sera désactivé avant d'wait
être appelé. Voir Bash unsets * _PID variable avant de pouvoir attendre sur coproc pour plus de détails.la source
read -u
devrait aussi bien fonctionner. L'exemple était censé être générique et montrer comment la sortie du coprocess pouvait être canalisée dans une autre commande.Une approche est la suivante:
L'idée est de faire écho à l'état de sortie avec le jeton aléatoire une fois la commande terminée, puis à utiliser des expressions régulières bash pour rechercher et extraire l'état de sortie. Le jeton est utilisé pour créer une chaîne unique à rechercher dans la sortie.
Ce n'est probablement pas la meilleure façon de le faire dans un sens général de programmation, mais c'est peut-être la façon la moins pénible de le gérer en bash.
la source