LINUX.ORG.RU

Получить exit code, с которым завершилась программа в середине скрипта

 , , ,


1

3

Есть такой скрипт:

if ! myprgm; then
  echo "fail"
  exit 1
fi

Я хочу сохранять то, что выводит myprgm в stdout в файл stdout.txt и для каждой строчки печатать в stdout «o», а вывод в stderr сохранять в stderr.txt и и для каждой строчки печатать в stdout «x». Вот что у меня получилось:

mkfifo out
mkfifo err

process_out() {
  while read line; do
    echo "${line}" >> stdout.txt
    /bin/echo -n "o"
  done < out
}

process_err() {
  while read line; do
    echo "${line}" >> stderr.txt
    /bin/echo -n "x"
  done < err
}

if ! myprgm > out 2> err & process_out & process_err; then
  echo "fail"
  exit 1
fi
Но это не будет работать, потому что $?, от которого зависит срабатывание if будет принадлежать функции process_err, а не myprgm.

Как можно грамотно переписать этот говнокод? Хотелось бы, чтобы работало в POSIX-совместимом шелле.

★★★★★

Ответ на: комментарий от Samamy

Вот именно получение $? из первой функции меня и интересует.

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

А если не использовать python? Скрипт довольно большой и не хочется его переписывать. Можно, конечно, обернуть myprgm в скрипт, но это костыль.

CYB3R ★★★★★
() автор топика

вынести функции в отдельные скрипты ?

Samamy ★★★
()
Последнее исправление: Samamy (всего исправлений: 1)

а если замутить функцию которая будет вызывать другую функцию? типо того

geterror(){
  process_out() {
  while read line; do
    echo "${line}" >> stdout.txt
    /bin/echo -n "o"
  done < out
  }
error1=$?
}

Samamy ★★★
()
Последнее исправление: Samamy (всего исправлений: 1)

На баше (вроде на ksh и dash тоже можно «> >(...)», но это не posix, псевдокод)

process_out/err() {
  while read ...
  done # БЕЗ < out
}

if myprog > >(process_out) 2> >(process_err) ; then
  echo ok
else
  echo error
fi

ps. а, вообще, есть стандарт на posix-shell?

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

На баше

Да, можно попробовать с башизмами накостылять, но тогда портабельность пропадает.

dash тоже можно «> >(...)»

На самом деле нельзя, dash суров.

но это не posix

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

а, вообще, есть стандарт на posix-shell?

Есть.

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

Я сначала хотел отписать, что это точно работать не будет. Но решил сначала проверить. И оно работает, хоть и выглядит не очень, но где вы видели красивые шелл-скрипты? Спасибо!

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

>(command) как и <(command) - это запуск subshell. У subshell нет exit-кода.

anonymous
()
Ответ на: комментарий от MrClon

оно работает, хоть и выглядит не очень

Это выглядит «очень очень» по сравнению с шаманством над fifo.

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