J'ai écrit un programme qui attend des données sur une entrée standard, l'écrit dans un emplacement temporaire et le déplace vers un emplacement spécifié par l'utilisateur à la fin de l'entrée.Dans un canal, comment un programme en aval peut-il obtenir le code de sortie d'un programme en amont après la fin de l'entrée?
Par cela, je veux permettre aux pipelines comme celui-ci
# Does not work; truncates myfile
cat myfile | some_filter > myfile
# shall enable pseudo-inplace modification
cat myfile | some_filter | my_program myfile
Mais mon programme écrit actuellement le dossier indépendamment du fait que le tuyau a réussi en amont. Je veux éviter la perte de données si en amont rencontré une erreur et donc abandonner le programme si l'un des programmes en amont du tuyau a jeté une erreur. Pour l'instant, j'ai écrit le programme dans bash mais je ne suis pas limité à cela.
Comment puis-je vérifier cela dans mon programme? Pour être plus précis: je veux épargner à mon utilisateur la création de fichiers temporaires, vérifier autant que possible le succès des programmes intermédiaires et similaires. Je veux que l'utilisateur puisse appeler un programme (par exemple ajouter une colonne à un fichier texte, trier, filtrer, n'importe quoi) sur un fichier et écrire le résultat dans ce même fichier, mais seulement si les programmes intermédiaires ont réussi.
Vous pouvez utiliser mktemp pour créer un fichier temporaire, écrire dans le fichier temporaire, vérifier si le processus s'est terminé avec succès, puis écrire à partir du fichier temporaire dans votre fichier, supprimer le fichier temporaire. – dood
Pour expliquer ce que @dood a dit: 'tmpfile = $ (mktemp); processus1 | process2> $ tmpfile && mv $ tmpfile monfichier – anishsane
Aussi, 'cat myfile | some_filter' est [UUOC] (http://porkmail.org/era/unix/award.html#cat). Utilisez 'some_filter
anishsane