LINUX.ORG.RU

Теряеться код возврата в конвеере :(


0

0

Нужен код возврата комманды ls из конструкции:
ls /path | tee /path_to_file
всегда возвращает 0 - т.е. успешно выполнено, в не зависимости от результата вывода ls

конструкция в виде:
ls /path > /path_to_file
так возрващает правильно, но не подходит, ибо нужен вывод сразу в >1 файла!


man bash

PIPESTATUS
              An  array  variable (see Arrays below) containing a list of exit status values from the processes in
              the most-recently-executed foreground pipeline (which may contain only a single command).

cvv ★★★★★
()
Ответ на: комментарий от cvv

Спасибо что не послал! :-/

Маны я читаю в первую очередь, потом лезу на опеннет

А тут труба! Нихера понять не могу :(

Ant0
() автор топика
Ответ на: комментарий от Ant0

>А тут труба! Нихера понять не могу :(

в смысле на русский перевести?

обясняю доступней: не с той переменной ты код возврата берёш.

cvv ★★★★★
()
Ответ на: комментарий от cvv

да это и я понял, что не с той переменной, что отдаеться мне статус от последней комманды в конвеере :(

а как вот взять код возврата именно с ls?
вопрос подругому: как узнать чего возвращает ls?

в shell-е я новичек :(

Ant0
() автор топика
Ответ на: комментарий от Ant0

тебе надо взять какой-то элемент массива PIPESTATUS. синтаксис баша для этого случая я не помню

cvv ★★★★★
()
Ответ на: комментарий от Die-Hard

Все бы хорошо, в баше такая конструкция работает!
но дело в том что я спрашиваю про shell - обычный POSIX-совместимый шелл :(

а конкретнее: шел из басибокса

ех...

Ant0
() автор топика

> конструкция в виде:
> ls /path > /path_to_file
> так возрващает правильно, но не подходит, ибо нужен вывод сразу в >1 файла!

А так не покатит?

ls /path > /path_to_file
#здесь проверяем код завершения
cat /path_to_file

nobody ★★
()
Ответ на: комментарий от Pi

>>а нужен именно код возврата или наличие ошибки?
Желателен код возврата, но можно обойтись и есть ошибка или нет.

Ant0
() автор топика
Ответ на: комментарий от nobody

>>ls /path > /path_to_file
>>#здесь проверяем код завершения
>>cat /path_to_file
не кактит по причине неинтерактивности
потому как под ls можед быть запуск другой проги, шаравола к примеру - который доооолко и муторно делает проверки и выводит инфу на экран

вот и хочется tee - чтобы и на экран и в файло сразу же пихалось

Ant0
() автор топика
Ответ на: комментарий от Die-Hard

>Тогда, наверное, никак...
Не может такого быть!
Уверен, что я далеко не первый, кто сталкнулся с такой проблемой!

Ant0
() автор топика

Урааа!
Мегачел Exception13 подсказал такую идею:
(ls /path; echo $? >status_file)|tee my_file
она работаит! ;)

На схожую указал amm - тоже спасибо! ;)

Из нее вывел такую весч (может кому пригадицца) :)


STATUSFILE="/var/tmp/shorewall_status"
LOGFILE="/var/tmp/shorewall_log"
CONSOLE="/dev/console"
SHOREWALL="/sbin/shorewall"

(
$SHOREWALL start
if [ $? -eq 0 ]
then
echo "Firewall started." > $CONSOLE
echo "started" > $STATUSFILE
else
echo "Error starting firewall!" > $CONSOLE
echo "error" > $STATUSFILE
fi
) 2>&1 | tee $LOGFILE > $CONSOLE

Ant0
() автор топика
Ответ на: комментарий от Ant0

Может вместо shell воспользоваться чем-то другим?
Например, awk:

awk 'BEGIN{
   while (("ls /path"|getline)) {
      print $0>"my_file"
      print $0
   }
   print "CODE=" close("ls /aaa")
}'

kosmonavt
()
Ответ на: комментарий от cvv

>>я бы на твоём месте не делал форка и код возврата помещал не в файл а впеременную

А можно кодом ткнуть? ;)
Взарание спасибо! ;))

Ant0
() автор топика
Ответ на: комментарий от kosmonavt

>Может вместо shell воспользоваться чем-то другим?
>Например, awk:
может, но ИМХО код становиться сложнее и хуже читаем :(
да и awk в басибоксе очень урезан (и вообще его может не быть)
но за идею спасибо! ;)

Ant0
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.