Ключевые слова:pipe, shell, error, (найти похожие документы)
Date: Tue, 25 Mar 2003 17:29:42 +0500
From: Valentin Nechayev <netch@segfault.kiev.ua>
Newsgroups: ftn.ru.unix.prog
Subject: Код возврата в shell при использовании pipe.
>>> всего пайпа - это код возврата последней команды. А мне надо во что бы
>>> то ни стало получить не нулевой код возврата если хотя бы одна команда
>>> вернула ненулевой код. :(
>>> Этот пайп выполняется через system() поэтому другой шел я выбрать не
>>> могу (знаю, что в ksh это можно решить) :(
AC> Меня вот этот вопрос мучает уже ооочень давно,
AC> правда мне это нужно внутри shell - без C.
AC>
AC> В bash я воспользовался
AC> ${PIPESTATUS[@]}
AC> В zsh тоже как-то можно.
AC> Причём везде по-разному.
AC>
AC> Остался вопрос:
AC> почему нет такой возможности в стандартном shell?
Я этот вопрос как-то подымал пару раз, в ru.linux и аналогичных местах.
Конструктивного ответа всё равно не было, а неконструктивные сводились к
тому, что случай проблем с предыдущими командами в конвейере и так чреват
разными формами неправильной работы (например, программа перед |mail померла
в пытках по сигналу 10 - mail не скажет, что что-то случилось, а отправит
обрезанное письмо), и если хочется нормальной надёжности, при которой проверка
предыдущих команд на что-то влияет - то надо делать не пайп на шелле,
а или складывать в файл и кормить следующему только когда предыдущий
успешно завершился, или делать какой-то умный прокси-и-контролёр, а все
процессы при этом должны получать сигнал (в общем смысле) "данные пришли
все, правильные, делай своё заключение" и только тогда отдавать свой
аналогичный сигнал "все ок, передавай дальше". Гимор, в общем.
А конвейер его в традиционном смысле - не защищён от этих проблем, и, как
уже сказал, считать коды по дороге - смысла не очень...
-netch-
Ващета для конвейра из 2 команд есть такая возможность. Легко догадаться, что не без изголятельств. В стандартном Борновском шелле будя работать. А вот csh в пролёте.
За подробностями обращайтесь к книге "инструментальные средства ЮНИКС".
Если команд больше, то я бы порекоммендовал каждую контролировать отдельно, сделав для нее обёртку из сценария, и запусать их в фоновом режиме параллельно.
Взаимодействие же этих команд осуществлять через именнованные каналы.