Je veux que mes scripts shell échouent chaque fois qu'une commande exécutée avec eux échoue.
En général, je le fais avec:
set -e
set -o pipefail
(généralement j'ajoute set -u
aussi)
Le fait est que rien de ce qui précède ne fonctionne avec la substitution de processus. Ce code affiche "ok" et quitte avec le code retour = 0, alors que j'aimerais qu'il échoue:
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
Y a-t-il quelque chose d'équivalent à "pipefail" sauf pour la substitution de processus? Est-il possible de transmettre à une commande la sortie des commandes telles qu'elles étaient des fichiers, mais déclencher une erreur chaque fois que l'un de ces programmes échoue?
La solution d'un pauvre serait de détecter si ces commandes écrivent sur stderr (mais certaines commandes écrivent sur stderr dans des scénarios réussis).
Une autre solution plus conforme à Posix consisterait à utiliser des canaux nommés, mais je dois lancer ces commandes qui utilisent la substitution de processus comme des oneliners construits à la volée à partir du code compilé, et la création de canaux nommés compliquerait les choses (commandes supplémentaires, erreur de piégeage pour les supprimer, etc.)
$$
substitution ne fonctionne pas pour moi, car cette substitution de commande ne se fait pas car la commande qui utilise la substitution de processus se fait à l'intérieur d'un pipeline de commandes généré à partir d'un code "non shell" (python). Je devrais probablement créer un sous-processus en python et les diriger par programme.
kill -2 0
.
mkfifo pipe; { rm pipe; cat <file; } >pipe
. Cette commande va se bloquer jusqu'à ce qu'un lecteur s'ouvrepipe
car c'est le shell qui fait leopen()
et donc dès qu'il y a un lecteur surpipe
le lien fs pourpipe
isrm
'd puiscat
copie les fichiers dans le descripteur du shell pour ce pipe. Et de toute façon, si vous voulez propager une erreur à partir d'un sous-processus: <( ! : || kill -2 "$$")