目標:端末とは無関係にコマンドを実行し、すぐに返します。コマンドが失敗した場合は、代替端末非依存コマンドを実行して直ちに返します。
私は次のことをしました。コマンドが有効な場合は動作しますが、失敗してもエラーコード0を返します。最初の拒否を削除してコードを変更できますが、コマンドはすぐには返されません。
ErrorCode=$(
nohup "${Command[@]}" >/dev/null 2>&1 &
Pid=$!
disown "${Pid}"
wait "${Pid}"
echo "$?"
)
if ((ErrorCode != 0)); then
nohup "${CommandAlternative[@]}" >/dev/null 2>&1 &
else
echo "#Debug: ErrorCode: ${ErrorCode}"
fi
したがって、デフォルトでは、前のコマンドのエラーコードをキャプチャできません。コマンドはmpv "${MusicFile}"
答え1
コマンドが失敗し、3秒以内に終了したとします。
"${Command[@]}" >/dev/null 2>&1 &
Pid=$!
disown "${Pid}"
sleep 3
if ! ps --pid "$Pid" >/dev/null; then
"${CommandAlternative[@]}" >/dev/null 2>&1 &
disown
fi
効果:前のコマンドが失敗して3秒以内に終了した場合は、代替コマンドを実行してください。