Я написал программу, которая ждет данных на стандартном входе, записывает ее в временное местоположение и перемещает ее в указанное пользователем местоположение по окончании ввода.В трубе, как программа вниз по течению получает код выхода программы вверх по течению после окончания ввода?
К этому, я хочу, чтобы включить трубопроводы как этот
# Does not work; truncates myfile
cat myfile | some_filter > myfile
# shall enable pseudo-inplace modification
cat myfile | some_filter | my_program myfile
Но моя программа в настоящее время пишет в файл независимо от того, вверх по течению была успешной труба. Я хочу избежать потери данных, если восходящий поток обнаружил ошибку и, следовательно, прервал выполнение программы, если одна из программ, расположенных выше по потоку, вытолкнула ошибку.
На данный момент я написал программу в bash, но не ограничился ею.
Как я могу проверить это в своей программе?
EDIT: Чтобы быть более конкретным: я хочу, чтобы мой пользователь имел дело с созданием временных файлов, проверял успех промежуточных программ и подобных им как можно больше. Я хочу, чтобы пользователь мог вызвать какую-либо программу (например, добавить столбец в текстовый файл, сортировать, фильтровать и т. Д.) В каком-либо файле и записать результат обратно в тот же файл, но только если промежуточные прогаммы вернули успех.
Вы можете попробовать использовать mktemp для создания временного файла, записать в файл temp, проверить, завершился ли процесс успешно, а затем записать из файла temp в ваш файл, удалить файл temp. – dood
Чтобы объяснить, что @dood сказал: 'tmpfile = $ (mktemp); process1 | process2> $ tmpfile && mv $ tmpfile myfile' – anishsane
Также, 'cat myfile | some_filter' является [UUOC] (http://porkmail.org/era/unix/award.html#cat). Вместо этого используйте 'some_filter
anishsane