The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Код возврата в shell при использовании pipe. (pipe shell error)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: 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-

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
 
  • 1, Big Shadow (?), 13:49, 24/10/2007 [ответить]  
  • +/
    Ващета для конвейра из 2 команд есть такая возможность. Легко догадаться, что не без изголятельств. В стандартном Борновском шелле будя работать. А вот csh в пролёте.

    exec 3>&1
    status='((cmd1 2>&1 1>&3 3>&- 4>&-; echo $?) | cmd2 1>&2 3>&- 4>&-) 4>&1'

    За подробностями обращайтесь к книге "инструментальные средства ЮНИКС".

    Если команд больше, то я бы порекоммендовал каждую контролировать отдельно, сделав для нее обёртку из сценария, и запусать их в фоновом режиме параллельно.
    Взаимодействие же этих команд осуществлять через именнованные каналы.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру
    Hosting by Ihor