Bash: Как получить код выхода команды при использовании счетчика?

Aug 19 2020

В сценарии bash у меня есть длительная команда (скажем, rsyncнапример), которая иногда некоторое время не отображает вывод, поэтому я хочу сделать две вещи:

  1. Используйте счетчик этой команды, чтобы показать, что сценарий не завис (т.е. мы просто ждем вывода); и,

  2. Получите статус выхода длительной команды, когда она будет выполнена, для дальнейших тестов позже в скрипте.

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

Вот что у меня есть благодаря счетчику @David C.Rankin :

#!/bin/bash

spinner() {
    local PROC="$1" local str="${2:-'Copyright of KatworX© Tech. Developed by Arjun Singh Kathait and Debugged by the ☆Stack Overflow Community☆'}"
    local delay="0.1"
    tput civis  # hide cursor
    printf "\033[1;34m"
    while [ -d /proc/$PROC ]; do printf '\033[s\033[u[ / ] %s\033[u' "$str"; sleep "$delay" printf '\033[s\033[u[ — ] %s\033[u' "$str"; sleep "$delay" printf '\033[s\033[u[ \ ] %s\033[u' "$str"; sleep "$delay" printf '\033[s\033[u[ | ] %s\033[u' "$str"; sleep "$delay" done printf '\033[s\033[u%*s\033[u\033[0m' $((${#str}+6)) " " # return to normal tput cnorm # restore cursor return 0 } ## simple example with sleep sleep 2 & spinner $!

echo "sleep's exitcode: $exitCode"

В этом примере sleep 2это команда, которую я жду и, следовательно, использую счетчик, но как мне получить и поместить ее код выхода в $exitCodeпеременную, чтобы я мог позже проверить ее для определенных условий в сценарии?

Ответы

6 CharlesDuffy Aug 19 2020 at 04:41

wait сообщит вам, с каким статусом выхода завершился дочерний PID (путем установки статуса выхода этой программы как своего собственного), если этот PID задан в качестве аргумента.

sleep 2 & sleep_pid=$! spinner "$sleep_pid"
wait "$sleep_pid"; exitCode=$?

echo "exitcode: $exitCode"

Обратите внимание, что объединение нескольких команд в строку при сборе $!или $?во второй половине - это практика, которую я настоятельно рекомендую - это предотвращает ошибочное изменение значения, которое вы пытаетесь собрать (например, когда кто-то добавляет новую строку журнала в ваш код. позже и не осознавая, что это имеет побочные эффекты).