Bash:スピナーの使用中にコマンドの終了コードを取得するにはどうすればよいですか?

Aug 19 2020

bashスクリプトでは、実行時間の長いコマンド(rsyncたとえば)があり、しばらくの間出力が表示されないことがあるので、次の2つのことを実行します。

  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"

収集時$!または$?後半に複数のコマンドを1行に結合することを強くお勧めします。これにより、収集しようとしている値が誤って変更されるのを防ぐことができます(誰かがコードに新しいログ行を追加するなど)。後で、それに気づかないと副作用があります)。