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"

수집 할 때 $!또는 $?후반부 에 여러 명령을 한 줄에 결합 하는 것이 좋습니다. 수집하려는 값이 실수로 변경되는 것을 방지합니다 (누군가가 코드에 새 로그 줄을 추가하는 것처럼) 나중에 부작용이 있다는 것을 깨닫지 못함).