Привет всем! Никак не могу придумать, как решить простую задачу. Есть некий скрипт, все сообщения которого надо выводить на экран и одновременно в лог. При этом по окончании работы скрипта нужно знать, какой он выдал код возврата (удачей завершился или нет). Вот такая попытка (вместо имени скрипта - true/false): #!/bin/bash echo "----------" echo "ok:" true | tee ./test1.log if [ "$?" = "0" ] ;then echo "ok" else echo "fail" fi echo "---" echo "fail:" false | tee ./test2.log if [ "$?" = "0" ] ;then echo "ok" else echo "fail" fi echo "-----------" дала вот такой результат: ---------- ok: ok --- fail: ok ----------- Почему? Код возврата конвеера - это то, что вернула последняя команда в конвеере? Вроде бы вот так эта мысль подтверждается: false | true | true if [ "$?" = "0" ] ;then echo "ok" else echo "fail" fi true | true | false if [ "$?" = "0" ] ;then echo "ok" else echo "fail" fi Ответ: ok fail Как-то странно. По-моему, логичнее было бы вычислять код возврата по всему конвееру: если хоть одна неудача - значит, неудача; иначе успех. Далее: #!/bin/bash echo "----------" RES=5 echo "ok:" (true && RES=0) | tee ./test1.log echo "RES=" $RES echo "---" RES=5 echo "fail:" (false && RES=0) | tee ./test2.log echo "RES=" $RES echo "-----------" Дало: ---------- ok: RES= 5 --- fail: RES= 5 ----------- Почему не так: ---------- ok: RES= 0 --- fail: RES= 5 ----------- В чём тут подвох?