프로세스가 완료될 때까지 기다리는 문은 무시됩니다.

프로세스가 완료될 때까지 기다리는 문은 무시됩니다.

sudo 권한을 사용하지 않고 git 설치를 자동화하려고 합니다. 좋은(그러나 느린) 해결 방법은 git과 함께 번들로 제공되며 xcode-select --install표준 사용자가 호출 할 수 있는 Xcode를 설치하는 것입니다.

#!/bin/bash
# check if user has git installed
which git &> /dev/null
OUT=$?
sleep 3


# if output of git check is not 0(not foud) then run installer
if [ ! $OUT -eq 0 ]; then
    xcode_dialog () {
        XCODE_MESSAGE="$(osascript -e 'tell app "System Events" to display dialog "Please click install when Command Line Developer Tools appears"')"
        if [ "$XCODE_MESSAGE" = "button returned:OK" ]; then
            xcode-select --install
        else
            echo "You have cancelled the installation, please rerun the installer."
        fi
    }
    xcode_dialog
fi

# get xcode installer process ID by name and wait for it to finish
until  [ ! "$(pgrep -i 'Install Command Line Developer Tools')" ]; do
    sleep 1
done

echo 'Xcode has finished installing'

which git &> /dev/null
OUT=$?
if [ $OUT = 0 ]; then
    echo 'Xcode was installed incorrectly'
    exit 1
fi

그러나 내 until명령문은 완전히 무시되었으며 XCODE_MESSAGEOK가 반환되자마자 git에 대한 두 번째 검사가 거의 실행됩니다. 설치 프로그램이 완료될 때까지 기다리는 논리를 더 잘 구현하는 방법을 아는 사람이 있습니까?

답변1

스크립트에서 따르는 접근 방식을 약간 변경하겠습니다. "git"이 있는지 확인하는 대신 설치 프로세스가 실행되고 있지 않은지 확인하세요.

#!/bin/bash

# check if user has git installed and propose to install if not installed
if [ "$(which git)" ]; then
        echo "You already have git. Exiting.."
        exit
else
        XCODE_MESSAGE="$(osascript -e 'tell app "System Events" to display dialog "Please click install when Command Line Developer Tools appears"')"
        if [ "$XCODE_MESSAGE" = "button returned:OK" ]; then
            xcode-select --install
        else
            echo "You have cancelled the installation, please rerun the installer."
            # you have forgotten to exit here
            exit
        fi
fi

until [ "$(which git)" ]; do
        echo -n "."
        sleep 1
done
echo ""

echo 'Xcode has finished installing'

관련 정보