Bash: Как получить код выхода команды при использовании счетчика?
В сценарии bash у меня есть длительная команда (скажем, rsync
например), которая иногда некоторое время не отображает вывод, поэтому я хочу сделать две вещи:
Используйте счетчик этой команды, чтобы показать, что сценарий не завис (т.е. мы просто ждем вывода); и,
Получите статус выхода длительной команды, когда она будет выполнена, для дальнейших тестов позже в скрипте.
Однако проблема в том, что я не очень хорошо понимаю обработку отправки процессов в фон, а также обработку кода выхода таким образом, поэтому я не уверен, как это сделать.
Вот что у меня есть благодаря счетчику @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
переменную, чтобы я мог позже проверить ее для определенных условий в сценарии?
Ответы
wait
сообщит вам, с каким статусом выхода завершился дочерний PID (путем установки статуса выхода этой программы как своего собственного), если этот PID задан в качестве аргумента.
sleep 2 & sleep_pid=$! spinner "$sleep_pid"
wait "$sleep_pid"; exitCode=$?
echo "exitcode: $exitCode"
Обратите внимание, что объединение нескольких команд в строку при сборе $!
или $?
во второй половине - это практика, которую я настоятельно рекомендую - это предотвращает ошибочное изменение значения, которое вы пытаетесь собрать (например, когда кто-то добавляет новую строку журнала в ваш код. позже и не осознавая, что это имеет побочные эффекты).